javascript中var FOO = FOO | || {}

How does the var FOO = FOO || {} idiom in Javascript work?

从这个问题来看:在javascript中,"var foo=foo"(为该变量分配一个变量或一个空对象)是什么意思?

我了解到,var FOO = FOO || {}本质上意味着"如果foo存在,那么就不要动它,否则就把它变成一个空的对象"。

但是如何呢?

这就是我分析这种语法的方法:

var FOO = (FOO || {})

所以:如果FOO存在并计算为布尔值真,那么(FOO || {})将返回真,因此最终FOO将被完全覆盖,并从现在起保持布尔值真。

否则,(FOO || {})将返回到{}值要返回的任何布尔值。由于{}是一个空对象,所以它的计算结果总是正确的…

那么在任何情况下,(FOO || {})都应该评估为真,所以…

在任何可能的情况下,在评估了var FOO = FOO || {}之后,foo都应该保持零碎的布尔值true,而不管它以前持有什么。根据我的理解,本质上,var FOO = FOO || {}应该等同于var FOO = True

我的错误在哪里?


If FOO exists AND evaluates to Boolean value of True, then (FOO || {}) will return True

这不是||操作符在JS中的工作方式。

正确的解释是:

如果左侧为真值,则按左侧(即FOO)计算,否则按右侧(即{})计算。

1
2
3
4
5
6
var zero = 0;
var one = 1;
var two = 2;

console.log(zero || two);
console.log(one || two);


So: If FOO exists AND evaluates to Boolean value of True, then (FOO || {}) will return True, so eventually FOO will be completely overwritten and will hold the Boolean value of True from now on.

这是错误的,但是如果您的背景是严格键入的语言,下面的几行会让您感到惊讶:)

表达式不返回布尔值。它返回可计算为true的表达式。

这是相同的文件

Returns expr1 if it can be converted to true; otherwise, returns expr2. Thus, when used with Boolean values, || returns true if either operand is true; if both are false, returns false.

Logical operators are typically used with Boolean (logical) values. When they are, they return a Boolean value. However, the && and || operators actually return the value of one of the specified operands, so if these operators are used with non-Boolean values, they may return a non-Boolean value.

文档中给出的不同示例可能有助于您理解上述单词。

1
2
3
4
5
o4 = false || (3 == 4)   // f || f returns false
o5 = 'Cat' || 'Dog'      // t || t returns"Cat"
o6 = false || 'Cat'      // f || t returns"Cat"
o7 = 'Cat' || false      // t || f returns"Cat"
o8 = ''    || false      // returns false


javascript ||运算符返回表达式本身而不是布尔值。这是来自Mozilla文档的参考资料

Returns expr1 if it can be converted to true; otherwise, returns
expr2. Thus, when used with Boolean values, || returns true if either
operand is true.

Reference :

在布尔值中转换为True取决于表达式的计算结果是否为真值。


这是因为短路评估。

短路评估表示,只有当第一个参数不足以确定表达式的值时,才执行或评估第二个参数:当and(&;&;)函数的第一个参数的值为false时,整体值必须为false;当or()函数的第一个参数的值为true时,OV所有值必须为真。

但是,如果and函数的第一个参数的值为true,则必须执行或计算第二个参数以确定表达式的值;如果or函数的第一个参数的值为false,则必须执行或计算第二个参数以确定表达式的值。

如果是foo

  • 如果foo的计算结果为true,则返回foo,因为如果第一个参数为true,则不需要计算第二个参数。
  • 如果foo的计算结果为false,则返回,因为需要计算第二个参数以获取表达式的值。
  • 有关详细信息,请参阅此处。


    So: If FOO exists AND evaluates to Boolean value of True, then (FOO ||
    {}) will return True

    这个概念的问题在于演员阵容。这里的对象不是强制转换为Boolean,JS不动它。

    因此,如果定义了foo,那么(FOO || {})将返回FOO,如果没有定义,则返回{}