JavaScript OR(||)变量赋值说明

cha*_*tsm 332 javascript variables variable-assignment or-operator

给出这段JavaScript代码......

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下这种技术的用途(我最好的猜测是在这个问题的标题中!)?它是如何/为什么它正常工作?

我的理解是变量f将被赋予第一个变量的最近值(从左到右),该变量的值不是null或未定义,但是我没有设法找到关于这种技术的很多参考资料并且有看到它用了很多.

此外,这种技术是否特定于JavaScript?我知道在PHP中做类似的事情会导致产生f一个真正的布尔值,而不是d它自身的值.

unw*_*ind 202

有关说明,请参见短路评估.这是实现这些运营商的常用方式; 它不是JavaScript独有的.

  • 请记住'gotcha',即使它们都是未定义的,null或false,最后一个将始终被分配.在链的末尾设置你知道的东西不是假的,空的或未定义的,这是发现没有找到任何东西的好方法. (50认同)
  • 实际上,你可以做`if(true == f)`,这与`if(f)`相同:测试将通过.如果你还要测试`f`的*type*,使用严格的比较:`if(true === f)`,这确实会失败. (8认同)
  • 是的,短路评估很常见.但这里的区别在于JavaScript返回停止执行的最后一个值的方式.@ Anurag的回答在解释这个方面做得更好. (5认同)

CMS*_*CMS 181

如果变量是的,则用于指定默认值,在这种情况下为值.yx

JavaScript中的布尔运算符可以返回操作数,而不像其他语言那样总是布尔结果.

Logical OR运算符(||)返回其第二个操作数的值,如果第一个操作数是假的,否则返回第一个操作数的值.

例如:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"
Run Code Online (Sandbox Code Playgroud)

Falsy值是谁强迫要false在布尔上下文中使用时,它们是0,null,undefined,一个空字符串,NaN当然false.

  • *Falsy*实际上是技术术语. (12认同)
  • @Support(@Oscar):逻辑`&&'运算符有类似的行为,它返回第一个操作数的值,如果它本身是*falsy*并返回第二个操作数的值,只有当第一个操作数是*truthy时*,例如`("foo"&&"bar")=="bar"`和`(0 &&"bar")== 0` (9认同)
  • 所以我们在这篇文章中了解了||,&&,"Falsy"和"Truly"."隐藏"礼物的最佳答案. (8认同)
  • @Alex NB:"Truthy"(!"真的") (4认同)
  • +1 还有这样的运营商吗?或者是`||` 排他性的。 (2认同)

Anu*_*rag 161

Javacript使用短路评价为逻辑运算符||&&.但是,它与其他语言的不同之处在于它返回停止执行的最后一个值的结果,而不是a truefalsevalue.

JavaScript中的以下值被认为是假的.

  • 空值
  • "" (空字符串)
  • 0
  • 未定义

忽略运算符优先级规则并保持简单,以下示例显示哪个值暂停了评估,并作为结果返回.

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Run Code Online (Sandbox Code Playgroud)

前5个值NaN是假的,所以它们都是从左到右进行评估,直到它满足第一个truthy值 - "Hello"这使整个表达式成为真,所以任何进一步的东西都不会被评估,并且"Hello"作为表达式的结果返回.同样,在这种情况下:

1 && [] && {} && true && "World" && null && 2010 // null
Run Code Online (Sandbox Code Playgroud)

前5个值都是真实的并且得到评估,直到它满足第一个假值(null),这使得表达式为false,因此2010不再进行求值,并且null作为表达式的结果返回.

您给出的示例是使用JavaScript的此属性来执行赋值.它可以在任何需要在一组值中获得第一个truthy或falsy值的地方使用.下面的代码将赋值"Hello",b因为它可以更容易地分配默认值,而不是if-else检查.

var a = false;
var b = a || "Hello";
Run Code Online (Sandbox Code Playgroud)

您可以将下面的示例称为利用此功能,我相信它会使代码更难阅读.

var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Run Code Online (Sandbox Code Playgroud)

在警报内,我们检查是否messages是假的,如果是,则评估并返回noNewMessagesText,否则评估并返回newMessagesText.由于在这个例子中它是假的,我们停在noNewMessagesText并发出警报"Sorry, you have no new messages.".

  • 在我看来,这是最好的答案,因为有以下解释:`但是,它与其他语言的不同之处在于它返回停止执行的最后一个值的结果,而不是真值或假值. (27认同)
  • 应该是答案,它显示了在测试用例中选择的值. (5认同)

Als*_*nde 48

Javascript变量没有输入,因此f可以分配一个整数值,即使它是通过布尔运算符赋值的.

f被赋予最接近的值,该值不等于false.所以0,false,null,undefined都被传递:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,不要忘记'''`也等于假. (13认同)
  • "最近的"并不完全正确,尽管它确实有这种外观.作为布尔运算符的布尔"||"运算符有两个操作数:左侧和右侧.如果`||`的左侧是*truthy*,则操作解析为左侧,右侧被忽略.如果左侧是*falsy*,它会解析到右侧.所以`null || undefined || 4 || 0`实际上解析为`undefined || 4 || 0`解析为'4 || 0`解析为`4`. (3认同)

Mar*_*cin 29

它没有任何魔力.像a || b || c || d懒惰计算的布尔表达式.Interpeter查找值a,它是未定义的,所以它是假的,所以它继续前进,然后它看到b哪个是null,它仍然给出错误的结果,所以它继续前进,然后它看到c- 相同的故事.最后它看到d并说'嗯,它不是空的,所以我有我的结果'并且它将它分配给最终变量.

这个技巧适用于对布尔表达式进行惰性短路评估的所有动态语言.在静态语言中,它不会编译(类型错误).在急于评估布尔表达式的语言中,它将返回逻辑值(在这种情况下为true).

  • 在漂亮的静态语言C#中可以使用?? 运算符ála:对象f = a ?? b ?? C ??d ?? Ë; (6认同)
  • 正如其他地方所提到的那样,最后的`d`将被分配,无论它是否为null/undefined. (3认同)
  • herzmeister - 谢谢!我不知道?运算符可以在C#中链接并用于惰性求值技术 (2认同)

WSi*_*son 8

这个问题已经收到了好几个答案.

总之,这种技术正在利用语言编译的特性.也就是说,JavaScript将布尔运算符的评估"短路",并返回与第一个非假变量值或最后一个变量包含的值相关联的值.请参阅Anurag对那些将评估为false的值的解释.

由于几个原因,使用这种技术并不是一种好的做法 然而.

  1. 代码可读性:这是使用布尔运算符,如果不理解此编译的行为,则预期结果将是布尔值.
  2. 稳定性:这是使用语言编译方式的特性,这种特性在多种语言中是不一致的,因此,它可能会成为未来变化的目标.
  3. 记录的功能:现有的替代方案可满足此需求,并且在更多语言中保持一致.这将是三元运算符:

    ()?值1:值2.

使用三元运算符确实需要更多的输入,但它清楚地区分了被评估的布尔表达式和被分配的值.此外,它可以链接,因此可以重新创建上面执行的默认分配类型.

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f =  ( a ) ? a : 
                ( b ) ? b :
                       ( c ) ? c :
                              ( d ) ? d :
                                      e;

alert(f); // 4
Run Code Online (Sandbox Code Playgroud)

  • 你真的认为怪物比`a || 更清楚 乙|| c|| d || e`? (2认同)

Ars*_* KV 5

返回输出第一个真值.

如果都是false则返回最后一个false值.

例:-

  null || undefined || false || 0 || 'apple'  // Return apple
Run Code Online (Sandbox Code Playgroud)


小智 5

其称为短路运算符。

短路求值表示,仅当第一个参数不足以确定表达式的值时才执行或求值第二个参数。当 OR (||) 函数的第一个参数计算结果为 true 时,整体值必须为 true。

它还可以用于设置函数参数的默认值。

function theSameOldFoo(name){ 
  name = name || 'Bar' ;
  console.log("My best friend's name is " + name);
}
theSameOldFoo();  // My best friend's name is Bar
theSameOldFoo('Bhaskar');  // My best friend's name is Bhaskar`
Run Code Online (Sandbox Code Playgroud)