分配中的Javascript AND运算符

Ale*_*lex 59 javascript variable-assignment logical-operators and-operator

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

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
Run Code Online (Sandbox Code Playgroud)

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

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

var oneOrTheOther = someOtherVar && "some string";
Run Code Online (Sandbox Code Playgroud)

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

只是学习JavaScript,我很好奇与AND运算符一起分配会发生什么.

CMS*_*CMS 76

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

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0
Run Code Online (Sandbox Code Playgroud)

需要注意的是falsy值是那些强迫要false在布尔上下文中使用时,它们是null,undefined,0,NaN,一个空字符串,当然false,什么都强求来true.


myk*_*hal 26

&&有时被称为守卫操作员.

variable = indicator && value
Run Code Online (Sandbox Code Playgroud)

只有当指标真实时,它才能用于设置值.

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

Dan*_*llo 18

引用道格拉斯·克罗克福德1:

&&操作者产生其第一个操作数的值,如果所述第一操作数是falsy.否则它产生第二个操作数的值.


1 Douglas Crockford:JavaScript:好的部分 - 第16页


Jas*_*ing 14

初学者示例

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

Uncaught TypeError: Cannot read property 'name' of undefined 
Run Code Online (Sandbox Code Playgroud)

不要害怕.您可以使用赋值中的&&运算符来解决此问题,或者通常称为保护运算符,因为它" 防范 "未定义的错误发生.

以下是一些您可能会发现奇怪的例子,但请继续阅读,稍后会对此进行解释.

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
Run Code Online (Sandbox Code Playgroud)

说明:在保护操作中,每个术语一次从左到右进行一次评估.如果评估的值是假的,则评估停止,然后分配该值.如果到达最后一个项目,则分配它是否是假的.

falsy意味着它是这些价值中的任何一个,undefined, false, 0, null, NaN, ''真正的意思并不是虚假的.

Guard方法的简易按钮

使用lodash的漂亮守护运算符来访问嵌套数据,如下所示:

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

因为它处理引擎盖下的&&东西,同时很方便使用方便的方法.Lodash _.get源代码

额外奖励:OR运营商

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

this.myWidget = this.myWidget || (function() {
   // define widget
})();
Run Code Online (Sandbox Code Playgroud)

如果"this.myWidget"是假的,它将只分配代码部分.这很方便,因为您可以在任何地方声明代码,如果之前已经分配过,则可以多次声明代码,知道它只会被分配一次,因为使用插件的人可能会意外地多次声明您的脚本标记src.

说明:每个值从左到右进行计算,一次一个.如果值是truthy,它停止评估并分配该值,否则,不断去,如果达到了最后一个项目,它不管分配,如果它是falsy与否.

额外信用:结合&&和|| 在一项任务中

你现在拥有极致的力量,可以做很奇怪的事情,例如在回文中使用它的这个非常奇怪的例子.

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

在这里深入解释:在Javascript中的回文检查

快乐的编码.