我了解到var FOO = FOO || {}
本质上意味着“如果存在FOO,则保持不变,否则将其作为空对象”。
但是怎么样?
这就是我解析这种语法的方法:
var FOO = (FOO || {})
所以:如果FOO
存在并且评估为布尔值True,则(FOO || {})
将返回True,因此最终FOO
将被完全覆盖并保持布尔值True现在开始。
否则(FOO || {})
将返回到值为{}
的任何布尔值。由于{}
的空对象始终计算为True ...
然后在任何情况下(FOO || {})
都应该评估为True,所以......
在任何可能的情况下,在评估var FOO = FOO || {}
之后,FOO应该保持普通的布尔值True,而不管之前持有的是什么。基本上,根据我的理解,var FOO = FOO || {}
应该等同于var FOO = True
。
我的错误在哪里?
答案 0 :(得分:10)
如果FOO存在且评估为布尔值True,则(FOO || {})将返回True
这不是||
运算符在JS中的运作方式。
正确的解释是:
如果左侧是真值,则评估为左侧(即FOO
),否则评估为右侧(即{}
)。
var zero = 0;
var one = 1;
var two = 2;
console.log(zero || two);
console.log(one || two);

答案 1 :(得分:7)
所以:如果FOO存在并且评估为布尔值True,则(FOO || {})将返回True,因此最终FOO将被完全覆盖并且从现在开始将保持布尔值True。
这是错误的,但如果您的背景是严格类型的语言,则以下行会让您感到惊讶:)
表达式不返回布尔值。它返回可以计算为true的表达式。
以下是同一
的docs如果可以转换为true,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,||如果任一操作数为true,则返回true;如果两者都为假,则返回false。
逻辑运算符通常与布尔(逻辑)值一起使用。如果是,则返回布尔值。然而,&&和||运算符实际上返回一个指定操作数的值,因此如果这些运算符与非布尔值一起使用,它们可能会返回非布尔值。
文档中给出的不同示例可能有助于您理解上述内容。
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
答案 2 :(得分:3)
JavaScript ||
运算符返回表达式本身而不是布尔值。以下是Mozilla文档的参考资料
如果可以转换为true,则返回expr1;否则,返回 表达式2。因此,当与布尔值一起使用时,||如果有,则返回true 操作数是真的。
在布尔值中转换为True
取决于表达式是否计算为Truthy值。
答案 3 :(得分:0)
所以:如果FOO存在并且评估为布尔值True,那么(FOO || {})将返回True
概念的问题是演员。这里的Object没有转换为Boolean,JS保持不变。
因此,如果定义了FOO,(FOO || {})
将返回FOO
,如果未定义将返回{}
答案 4 :(得分:0)
这是因为短路评估。
短路评估说,只有当第一个参数不足以确定表达式的值时才执行或计算第二个参数:当AND(&&)函数的第一个参数求值为false时,整体价值必须是假的;当OR(||)函数的第一个参数的计算结果为true时,整数值必须为真。
但是如果AND函数的第一个参数求值为true,则必须执行或计算第二个参数以确定表达式的值;当OR函数的第一个参数求值为false时,必须执行或计算第二个参数以确定表达式的值。
在FOO ||的情况下{};