分配中的Javascript AND运算符

时间:2010-07-02 05:25:29

标签: javascript variable-assignment logical-operators and-operator

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

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

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

但是,当我们使用逻辑AND运算符时,变量var oneOrTheOther = someOtherVar && "some string"; 被分配给什么?

someOtherVar

someOtherVar非假时会发生什么? {{1}}为假时会发生什么?

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

7 个答案:

答案 0 :(得分:72)

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

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

请注意, falsy 值是在布尔上下文中使用时强制为false的值,它们是nullundefined0NaN,空字符串,当然还有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运算符

实际使用中另一个有用的奇怪任务是 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)

我的看法与大多数答案不同,所以我希望这对某人有所帮助。

要计算涉及 || 的表达式,您可以在找到一个为真的术语后立即停止计算该表达式。在这种情况下,您有两方面的知识,而不仅仅是一项:

  1. 给定为真的术语,整个表达式的计算结果为真。
  2. 知道 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;

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