Javascript中的成语工作?
从这个问题来看:在Javascript中,“var FOO = FOO || {}”(为变量赋一个变量或空对象)是什么意思?
我已经知道var FOO = FOO || {}
var FOO = FOO || {}
本质上的意思是“如果FOO存在,则不要触摸它,否则将它作为空对象”。
但是如何?
这是我如何解析这个语法:
var FOO = (FOO || {})
因此:如果存在FOO
并且计算结果为布尔值True,则(FOO || {})
将返回True,因此最终FOO
将被完全覆盖并且从现在开始将保持布尔值为True。
否则(FOO || {})
将返回任何布尔值{}
evalueates。 由于{}
为空的对象总是评估为真...
那么在任何情况下(FOO || {})
应该评估为真,所以...
在任何可能的情况下,评估var FOO = FOO || {}
var FOO = FOO || {}
,FOO应该保持True的平凡布尔值,而不管之前持有的是什么。 从本质上讲,就我的理解而言, var FOO = FOO || {}
var FOO = FOO || {}
应该等同于var FOO = True
。
我的错误在哪里?
如果存在FOO并且计算为布尔值True,则(FOO || {})将返回True
那不是||
运算符在JS中工作。
正确的解释是:
如果左侧为真值,则评估为左侧(即FOO
),否则评估为右侧(即{}
)。
var zero = 0;
var one = 1;
var two = 2;
console.log(zero || two);
console.log(one || two);
因此:如果存在FOO并且计算结果为布尔值True,则(FOO || {})将返回True,因此最终FOO将被完全覆盖并且从现在开始将保持布尔值为True。
这是错误的,但如果你的背景是严格键入的语言,下面的行会让你大吃一惊:)
该表达式不返回布尔值。 它将可以评估的表达式返回为true。
这里是相同的文档
如果可以将其转换为true,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,|| 如果任一操作数为真,则返回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
JavaScript ||
运算符返回表达式本身而不是布尔值。 以下是Mozilla文档的参考资料
如果可以将其转换为true,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,|| 如果任一操作数为真,则返回true。
Reference :
在布尔中转换为True
取决于表达式是否计算为Truthy值。