分配中的JavaScript和运营商
-
02-10-2019 - |
题
我知道在JavaScript中您可以做:
var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
哪里变量 oneOrTheOther
如果不是第一个表达式的价值 null
, undefined
, , 或者 false
. 。在这种情况下,它将分配给第二个语句的值。
但是,变量是什么 oneOrTheOther
当我们使用逻辑和操作员时,分配给?
var oneOrTheOther = someOtherVar && "some string";
会发生什么 someOtherVar
是非false吗?
会发生什么 someOtherVar
是错误的吗?
只是学习JavaScript,我很好奇与和运营商结合作业会发生什么。
解决方案
基本上,逻辑和操作员(&&
),如果第一个是第一个操作数的值 真相, ,如果它本身就是第一操作数的值 虚假, , 例如:
true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything"; // 0
注意 虚假 价值是那些迫使 false
当在布尔环境中使用时,它们是 null
, undefined
, 0
, NaN
, ,一个空字符串,当然还有 false
, ,其他任何胁迫 true
.
其他提示
&&
有时被称为 警卫 操作员。
variable = indicator && value
仅当指标是真实的时,它才能用于设置值。
引用 道格拉斯·克罗克福德(Douglas Crockford)1:
这
&&
如果第一操作数是虚假的,则操作员会产生其第一部操作数的价值。否则,它会产生第二操作数的值。
1 道格拉斯·克罗克福德(Douglas Crockford): JavaScript:好部分 - 第16页
初学者的例子
如果您想访问“ user.name”,但这会发生:
Uncaught TypeError: Cannot read property 'name' of undefined
不要害怕。您可以使用 && 操作员 在作业或经常称为 后卫操作员 由于它是从未定义的错误中“守卫”的。
您可能会发现一些示例,但请继续阅读,如稍后所述。
var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined
user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'
user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined
解释: :在后卫操作中,评估每个学期 一次从左到右. 。如果评估的值是虚假的,则评估停止,然后分配该值。如果达到最后一项,则分配是否是虚假的。
虚假 意味着它是这些价值观中的任何一个 undefined, false, 0, null, NaN, ''
和 真相 只是意味着不要虚假。
守卫方法容易按钮
使用Lodash的美丽警卫操作员访问类似的嵌套数据:
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
当它处理引擎盖下的&&东西时,可以很好地使用方便的方法。 lodash _.get源代码
奖金:或操作员
实际使用中的另一个有用的奇怪任务是 或操作员 通常用于这样的插件:
this.myWidget = this.myWidget || (function() {
// define widget
})();
如果“ this.mywidget”是虚假的,则只会分配代码部分。这很方便,因为您可以在任何地方声明代码,并且多次不关心该代码,如果它被分配了,则知道它只会被分配一次,因为使用插件的人可能会意外声明您的脚本标签SRC多次。
解释: :从 从左到右,一次. 。如果一个值是真实的,它将停止评估并分配该值,否则,如果达到最后一项,则将不得不分配,无论是否虚假。
额外的信用:组合&&和||在作业中
您现在拥有最终的力量,可以做一些非常奇怪的事情,例如在palindrome中使用它的非常奇怪的例子。
function palindrome(s,i) {
return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}
在这里深入解释: palindrome在JavaScript中检查
愉快的编码。
如果逻辑或操作员(||),
expr1 || ExpR2如果可以将其转换为true,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,||如果任何操作数为true,则返回true;如果两个都是错误的,请返回false。
在给定的示例中,
var oneortheother = someothervar || “这些不是您要寻找的机器人……继续前进”;
结果将是某些渗透体的价值,如果布尔值(某些hothervar)。(请参考。 表达的真实性)。如果是错误的,结果将是“这些不是您要寻找的机器人……继续前进”;
如果逻辑和操作员(&&),
返回expr1如果可以转换为false;否则,返回expr2。因此,当与布尔值一起使用时,如果两个操作数都是正确的,则&&返回true;否则,返回false。
在给定的示例中,
案例1:当布尔值(某些hothervar)为false时:它返回某些渗透体的值。
案例2:当布尔值(某些渗透率)为真时:它返回“这些不是您正在寻找的机器人……沿着沿岸的机器人”。
我一直在工作中看到&&过度使用的作业语句。关注点是双重的:1)“指示器”检查有时是开发人员不考虑的开销的功能。 2)开发人员很容易将其视为安全检查,而不是认为他们为VAR分配了错误。我喜欢他们有一种类型的安全态度,所以我让他们改变了这一点:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();
为此:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;
因此,他们会按预期获得整数。