我知道在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中检查

愉快的编码。

根据 注释的ecmascript 5.1第11.11节:

如果逻辑或操作员(||),

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;

因此,他们会按预期获得整数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top