var FOO = FOO ||如何 Javascript中的{} idiom工作?

gaa*_*kam 6 javascript

从这个问题:"var FOO = FOO || {}"(将变量或空对象分配给该变量)在Javascript中是什么意思?

我已经知道这var FOO = FOO || {}基本上意味着"如果FOO存在,那就保持不变,否则就把它变成空物".

但是怎么样?

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

var FOO = (FOO || {})

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

否则(FOO || {})将返回到{}evalueates的任何布尔值.由于空对象,{}总是计算为True ...

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

在任何可能的情况下,在评估之后var FOO = FOO || {},FOO应该保持普通的布尔值True,而不管之前持有的是什么.基本上,根据我的理解,var FOO = FOO || {}应该相当于var FOO = True.

我的错误在哪里?

Que*_*tin 10

如果FOO存在并且评估为布尔值True,则(FOO || {})将返回True

这不是||运算符在JS中的工作方式.

正确的解释是:

如果左侧是真值,则评估为左侧(即FOO),否则评估为右侧(即{}).

var zero = 0;
var one = 1;
var two = 2;

console.log(zero || two);
console.log(one || two);
Run Code Online (Sandbox Code Playgroud)


Sur*_*tta 7

所以:如果FOO存在并且评估为布尔值True,则(FOO || {})将返回True,因此最终FOO将被完全覆盖并且从现在开始将保持布尔值True.

这是错误的,但如果你的背景是严格类型的语言,下面的行会让你感到惊讶:)

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

这是相同的文档

如果可以转换为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
Run Code Online (Sandbox Code Playgroud)


dlo*_*eda 0

因此:如果 FOO 存在并且计算结果为布尔值 True,则 (FOO || {}) 将返回 True

这个概念的问题在于演员阵容。这里的对象没有转换为布尔值,JS 保持不变。

因此,如果定义了 FOO(FOO || {})将返回FOO,如果未定义将返回{}