我知道在JavaScript中你可以这样做:
var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
如果变量oneOrTheOther
不是null
,undefined
或false
,则变量oneOrTheOther
将采用第一个表达式的值。在这种情况下,它被分配给第二个语句的值。
但是,当我们使用逻辑AND运算符时,变量var oneOrTheOther = someOtherVar && "some string";
被分配给什么?
someOtherVar
someOtherVar
非假时会发生什么?
{{1}}为假时会发生什么?
只是学习JavaScript,我很好奇与AND运算符一起分配会发生什么。
答案 0 :(得分:72)
基本上,逻辑AND运算符(&&
)将返回第二个操作数的值,如果第一个是 truthy ,它将返回第一个操作数的值,如果它本身就是 falsy ,例如:
true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything"; // 0
请注意, falsy 值是在布尔上下文中使用时强制为false
的值,它们是null
,undefined
,0
, NaN
,空字符串,当然还有false
,其他任何内容都强制为true
。
答案 1 :(得分:23)
&&
有时被称为 guard 运算符。
variable = indicator && value
只有当指标真实时,它才可用于设置值。
答案 2 :(得分:18)
引用Douglas Crockford 1 :
如果第一个操作数是假的,
&&
运算符会产生第一个操作数的值。否则它会产生第二个操作数的值。
1 Douglas Crockford:JavaScript: The Good Parts - 第16页
答案 3 :(得分:12)
如果您尝试访问" 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
解释:在守卫操作中,每个术语一次从左到右评估。如果评估的值是假的,则评估停止,然后分配该值。如果到达最后一个项目,则会分配它是否是假的。
falsy 表示这些值中的任何一个undefined, false, 0, null, NaN, ''
和 truthy 只是意味着不是假的。
Guard Method的简易按钮
使用lodash的漂亮后卫操作员来访问嵌套数据,如下所示:
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
因为它处理&&在引擎盖下的东西,同时很方便使用方便的方法。 Lodash _.get source code
实际使用中另一个有用的奇怪任务是 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);
}
在此深入解释:Palindrome check in Javascript
快乐的编码。
答案 4 :(得分:1)
根据Annotated ECMAScript 5.1 section 11.11:
对于Logical OR运算符(||),
expr1 || expr2如果可以转换为true,则返回expr1; 否则,返回expr2。因此,当与布尔值一起使用时,|| 如果任一操作数为true,则返回true;如果两者都是假的,则返回 假的。
在给定的例子中,
var oneOrTheOther = someOtherVar || “这些不是你正在寻找的机器人......继续前进”;
结果将是someOtherVar的值,如果Boolean(someOtherVar)为真。(请参阅Truthiness of an expression)。如果它是假的,那么结果将是“这些不是你正在寻找的机器人......继续前进”;
如果是Logical AND运算符(&&),
如果可以转换为false,则返回expr1;否则,返回 表达式2。因此,当与布尔值一起使用时,&&如果两者都返回true 操作数是真的;否则,返回false。
在给定的例子中,
案例1:当布尔值(someOtherVar)为false时:它返回someOtherVar的值。
案例2:当布尔值(someOtherVar)为真时:它返回“这些不是您正在寻找的机器人......移动”。
答案 5 :(得分:1)
我的看法与大多数答案不同,所以我希望这对某人有所帮助。
要计算涉及 ||
的表达式,您可以在找到一个为真的术语后立即停止计算该表达式。在这种情况下,您有两方面的知识,而不仅仅是一项:
例如,false || 5 || "hello"
计算直到并包括 5,这是真的,所以这个表达式计算为 true
并返回 5。
所以表达式的值是用于 if 语句的值,但最后一个计算项是分配变量时返回的值。
类似地,使用 &&
评估表达式涉及在第一个为假的术语处终止。然后它产生一个 false 值,并返回被评估的最后一项。 (编辑:实际上,它返回最后一个不为假的评估项。如果没有,则返回第一个。)
如果您现在阅读上述答案中的所有示例,那么一切都说得通:)
(这只是我对此事的看法,以及我对其实际运作方式的猜测。但未经证实。)
答案 6 :(得分:0)
我一直在看&&在工作中过度使用赋值语句。关注是双重的: 1)'指标'检查有时是开发人员不考虑的开销函数。 2)开发人员很容易将其视为安全检查而不考虑他们为其变量分配错误。我喜欢他们有一种类型安全的态度,所以我让他们改变这个:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();
到此:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;
所以他们按预期得到一个整数。