赋值内的JavaScript AND运算符


71

我知道您可以在JavaScript中执行以下操作:

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

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

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

var oneOrTheOther = someOtherVar && "some string";

someOtherVar非假的时候会发生什么?假的
时候会发生什么someOtherVar

只是学习JavaScript,我很好奇结合AND运算符的赋值会发生什么。



1
看到相关的职位我的回答.. stackoverflow.com/questions/3088098/...
阿努拉格

在您的示例中,如果someOtherVar未定义,将引发错误。如果未定义someOtherVar,则使用window.someOtherVar将使其采用第二个值。
Rich

Answers:


90

基本上,逻辑与运算符(&&),将返回第二操作数的值,如果第一个是truthy,它将返回第一操作数的值,如果它是由本身falsy,例如:

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

需要注意的是falsy值是那些裹胁到false在布尔上下文中使用时,它们是nullundefined0NaN,一个空字符串,当然false,什么都强求来true


喔好吧。谢谢。毕竟,这是“或”运算符的反函数。
亚历克斯(Alex)

因此,当与布尔值一起使用时,&&如果两个操作数都为true,则返回true;否则,返回false。(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Bardelman

我喜欢这个例子。如果您要加入一些&&被称为“后卫”运算符的人,那将是很好的选择,因为它是一个很好的上下文,它对空检查很有用。您甚至可以在这里引用Douglas Crockford:javascript.crockford.com/survey.html
Akrikos,2016年

30

&&有时称为警卫队

variable = indicator && value

仅当指标为真时,才可以使用它来设置值。


2
答案很明确。其他答案让我颇为困惑,但这是表达它的一种非常清晰的方式。谢谢!
ctaymor

我认为这个答案显然是错误的。执行完以上语句后,“ variable”的值即为表达式“ indicator && value”的值。因此,赋值左侧的变量值始终设置为某值。不管右侧发生了什么(除非引发错误)。没有?
Panu Logic


17

初学者示例

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

Uncaught TypeError: Cannot read property 'name' of undefined 

不要害怕。您可以在分配中使用&&运算符来解决此问题,或者通常将其称为guard运算符,因为它可以“保护”未发生的未定义错误。

这是一些示例,您可能会觉得很奇怪,但请继续阅读,如后面所述。

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的漂亮的Guard运算符访问嵌套数据,如下所示:

// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');

因为它可以很好地处理&&内容,同时又可以方便地使用。Lodash _.get源代码

奖励:或运算符

实际使用中的另一个有用的奇怪分配是OR运算符,该运算符通常用于如下所示的插件:

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

仅在“ this.myWidget”错误时才分配代码部分。这很方便,因为您可以在任何地方声明代码,而无需在意是否多次分配代码,而不必担心,因为知道该代码只会被分配一次,因为使用插件的人可能会不小心多次声明您的脚本标签src。

说明:每个值都是从左到右评估的,一次一次。如果值是真实的,则它将停止评估并分配该值,否则,将继续进行下去,如果到达最后一项,则无论是否为假,都将对其进行分配。

额外信用:结合&&和|| 在作业中

您现在拥有最终的力量,可以做一些非常奇怪的事情,例如在回文集中使用它的非常奇怪的例子。

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

在此深入解释:Java中的回文检查

快乐的编码。


谢谢你,很棒的例子!帮助我很多了解&&和|| 操作员!+1
幸运

感谢您的回答!我很好奇JS将尝试访问最深级别的属性多长时间?例如,如果您正在等待响应来敲击后端,那么使用它是否安全var x = y && y.z
Scott Savarie

2

根据带注释的ECMAScript 5.1第11.11节

如果是逻辑OR运算符(||),

expr1 || expr2如果可以将其转换为true,则返回expr1;否则返回false。否则,返回expr2。因此,当与布尔值一起使用时,|| 如果任一操作数为true,则返回true;如果两者均为假,则返回false。

在给定的示例中,

var oneOrTheOther = someOtherVar || “这些不是您正在寻找的机器人……前进”;

如果Boolean(someOtherVar)为true,则结果将为someOtherVar的值。(请参阅。表达式的真实性)。如果为假,则结果将为“这些不是您要查找的机器人...继续前进”;

如果是逻辑AND运算符(&&),

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

在给定的示例中,

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

情况2:当Boolean(someOtherVar)为true时:返回“这些不是您要查找的机器人...一起前进”。


0

我在这里看到&&在工作中过度使用赋值语句。问题有两点:1)“指标”检查有时是一种功能,而开发人员无法解决。2)对于开发人员来说,很容易将其视为安全检查,而不考虑他们为自己的var分配了false。我希望他们有类型安全的态度,所以我让他们改变了这一点:

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

对此:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.