Javascript AND运算符在赋值中

我知道在JavaScript中你可以这样做:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for..."; 

其中变量oneOrTheOther将采取第一个表达式的值,如果它不是nullundefinedfalse 。 在这种情况下,它被分配到第二个语句的值。

但是,当我们使用逻辑AND运算符时,变量oneOrTheOther被分配了什么?

 var oneOrTheOther = someOtherVar && "some string"; 

当其他someOtherVar是非假时会发生什么?
当其他someOtherVar错误时会发生什么?

刚刚学习JavaScript,我很好奇将与AND运算符一起分配会发生什么。

基本上,逻辑AND运算符( && )将返回第二个操作数的值,如果第一个操作数是真的 ,则返回第一个操作数的值,例如:

 true && "foo"; // "foo" NaN && "anything"; // NaN 0 && "anything"; // 0 

请注意,在布尔上下文中使用的伪造值是强制为false值,它们是nullundefined0NaN ,一个空字符串,当然是false ,其他任何强制为true

引用Douglas Crockford 1

如果第一个操作数是虚假的, &&操作符就会生成第一个操作数的值。 否则它产生第二个操作数的值。


1道格拉斯·克罗克福德: JavaScript:好的部分 – 第16页

&&有时被称为警卫操作员。

 variable = indicator && value 

只有在指标正常的情况下才可以使用。

初学者的例子

如果您尝试访问“user.name”,但是会发生这种情况:

 Uncaught TypeError: Cannot read property 'name' of undefined 

如果你不希望发生这种情况,你可以在一个任务中使用&&运算符来完成:

 // username is not assigned here var user = 'mrsmith'; var username = user && user.username; console.log('username', username); 

结果是未定义的。 如果user && user.name为false,则不会尝试访问“user.name”,并将“username”变量保留为undefined。

 // username is assigned here var user = 'mrsmith'; var username = user && user.username || user; console.log('username', username); 

结果在“mrsmith”用户&& user.name导致错误,所以然后去用户,并导致“mrsmith”

看这个简单的例子以供参考: https : //jsfiddle.net/qv6rg940/3/

实际使用的另一个有用的奇怪的任务是OR操作符,它只是定义了一些你可能在插件或框架中看到的未定义的东西,比如:

 this.myWidget = myWidget || (function() { // define widget })(); 

如果“myWidget”未定义,它将只定义小部件。

你甚至可以坚持这一点,并把它放在实际的算法逻辑如下:

 function palindrome(s,i) { return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i); } 

Lodash守卫方法

使用lodash的美丽的守卫操作符来访问嵌套数据,如下所示:

 var val = _.get(obj, 'some.very.nested.stuff.might.not.be.defined'); 

因为它处理引擎盖下的&&东西,而且使用方便。

根据注释的ECMAScript 5.1第11.11节 :

在逻辑OR运算符(||)的情况下,

expr1 || expr2如果可以转换为true,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,|| 如果任一操作数为真,则返回true; 如果两者都是错误的,则返回false。

在给定的例子中,

var oneOrTheOther = someOtherVar || “这些不是你正在寻找的机器人…移动”;

如果布尔(someOtherVar)为true,结果将是someOtherVar的值 (请参阅表达式的真值 )。 如果是错误的,结果将是“这些不是你正在寻找的机器人…移动”;

而在逻辑AND运算符(&&)的情况下,

如果可以将其转换为false,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,如果两个操作数都为真,则&&返回真; 否则,返回false。

在给定的例子中,

情况1:当布尔(someOtherVar)为false时:它返回someOtherVar的值。

情况2:当布尔(someOtherVar)是真的:它返回“这些不是你正在寻找的… …移动的机器人”。

我已经看到&&在这里工作过度使用任务报表。 关注点有两方面:1)“指标”检查有时是开发人员没有考虑到的开销。 2)开发者很容易把它看作是一个安全检查,并不认为他们正在为他们的var分配错误。 我喜欢他们有一个类型安全的态度,所以我让他们改变这个:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

对此:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

所以他们得到一个整数如预期。