为什么我写下面的脚本变量f的值是2016?
var year = 2016;
var g = 'foo';
var f = typeof g != 'undefined' && year;
答案 0 :(得分:7)
因为&&
是JavaScript中非常有趣的运算符:与其他一些语言不同,它不会产生true
或false
(必然)。相反,&&
的结果是左操作数的值,如果它是 falsy , 1 ,或者是其右操作数的值。
它的工作原理如下:
typeof g != 'undefined'
)。year)
并将其作为操作的结果。通过以下示例:
typeof g != 'undefined'
。由于typeof g
为'string'
,'string' != 'undefined'
,true
。true
不是假的,所以我们不会停止。year
并将结果作为结果。因此f
获得分配给它的2016年(year
的值)。
&&
有一个同样有趣的堂兄||
,我写了一篇关于此行为的博文:JavaScript's Curiously-Powerful OR Operator (||)
1 Falsy 值是在被视为布尔值时强制为false
的值。虚假值为0
,""
,NaN
,null
,undefined
,当然还有“假”。
2 Truthy 值是非 falsy 的值(当它们被视为布尔值时,它们强制true
。)< / p>
注意:当您将它们用作布尔值时,值的行为方式不与将它们与布尔值相比时的行为方式相同。 "foo"
是一个真值,但"foo" == true
和"foo" === true
都是 false
。
答案 1 :(得分:2)
是的,f
的值为2016
。
让我们分解您的代码。
typeof g != 'undefined' //returns true
在逻辑运算符的情况下,将返回最终值。在你的情况下
true && year //returns 2016
当满足&&
时,将返回最终值(年份)并将其分配给f
答案 2 :(得分:1)
&amp;&amp;运算符总是返回它测试的最后一个东西,因为在你的情况下是年份,它将返回year
的值。
&amp;&amp;永远不会将变量转换为布尔值,它只检查它是否是真正的值。
答案 3 :(得分:0)
&&
运算符如果为false则求值为左参数,否则求值为正确参数。
由于g
未未定义,typeof g != 'undefined'
为真,typeof g != 'undefined' && year
评估为year
,即2016年。
(这与其他语言不同,其中&&
或||
等逻辑运算符的结果将始终为布尔值,但JavaScript不是这种情况。)