代码段1:
if ( !x ) { /* do stuff */ }
Code-snippet 2:
if ( x == 0 ) { /* do stuff */ }
这两个代码段的x
值是多少?
我在问,因为虽然我在规范中阅读了==
的章节,但我仍然觉得很难处理上面的情况(它与ToBoolean强制相结合)。
===
或问我x
是什么。
更新: 我更正了第一个片段。我的意思是!x
。
答案 0 :(得分:5)
[] == 0
是真的; ![]
是假的null == 0
是假的; !null
是真的NaN == 0
是假的; !NaN
是真的undefined == 0
是假的; !undefined
是真的 !x
会检查x
是否为“假”
x == 0
会检查x
是否“等同于”0
。
这两个术语都是由Javascript规范定义的。
答案 1 :(得分:2)
以下内容将为您提供第一个true
和第二个代码段的false
:
NaN
null
undefined
这些会为您提供第一个false
和第二个代码段的true
:
[]
Number(x)
转换为0的任何其他字符串,例如“00”,“000”,“+ 0”和“-0”(我现在称之为“noughty strings” )0
,null
,undefined
或空字符串或空字符串的单个元素的数组。对于其他一切,你会得到两个片段相同的结果,尽管可能还有一两件我没想过的案例。
答案 2 :(得分:2)
这是一个关于非空字符串的有趣字符串,它只包含空格字符:
!!" "; // true
" " == true; // false
这是因为当您进行==
比较,并且其中一个值是数字或布尔值时,会尝试将另一个值转换为数字。
获得不同结果的原因是只有空格字符的字符串会转换为数字0
(或falsey),而只有通过!!
转换为布尔值的空格的字符串被视为一个非空字符串,因此true
。
所以:
var x = " ";
alert( !x ); // false
alert( x == 0 ); // true
修改强>
可能需要记住的关键是,在将数字或布尔值与非数字类型进行比较时,==
会尽可能使用 toNumber 转换,而!
使用 toBoolean 转换。它们并不总是一样的。
使用!!
很容易看到 toBoolean 转换的结果。如:
alert( !![] ); // true
但是在使用==
时,您无法真正看到 toNumber 转换的结果。
但是,您可以使用一元+
查看 toNumber 转换的结果。如:
alert( +[] ); // 0
我很确定在Array的情况下发生的事情是它首先得到toString
调用。因此:
// ---------------------toString result-------toNumber result (from string)
alert( +[] ); // "" 0
alert( +[""] ); // "" 0
alert( +[" "] ); // " " 0
alert( +[0] ); // "0" 0
alert( +["0"] ); // "0" 0
alert( +["3"] ); // "3" 3
alert( +[3,4] ); // "3,4" NaN
答案 3 :(得分:1)
简短回答:两者几乎总是相同但不是100%相同。
一个例子是(!'0')
这是假的,而('0' == 0)
是真的
<强>详细信息:强>
来自:http://www.joeyjavas.com/2007/08/04/javascript-true-false-checking-for-boolean-values/
在JavaScript中检查值是true还是false很简单。除了:
之外,所有值都评估为true
0
-0
null
undefined
NaN
empty string
false
因此,(!x)
对于x
的所有上述值都是正确的,只有那些。{/ p>
对于(x == 0),对于x的任何值都是如此 - when converted according to "==" conversion rules - 与数字相比转换为0(例如,布尔false
值) 。将true与==0
进行比较的其他示例是从valueOf()
方法生成0的对象,或字符串'0'
或空数组([]
)
答案 4 :(得分:0)
两者之间的区别在于
if ( x ) { ... }
测试x是否为“truthy”
而
if ( x == 0 ) { ... }
在x和0之间键入强制。
我认为你的意思是
if (x == 0) vs if (!x)
主要区别在于x的类型强制与数字的比较与检查x是否为假。
显然NaN
本身永远不会等于0,因为它不是数字。 undefined
也会强制执行NaN,以免被== 0
抓住。我无法解释为什么null
0
未被Number(null) == 0
抓住,因为{{1}}
答案 5 :(得分:0)
当x
非零时,或者求值为对象(而不是null
或undefined
),或者是非空字符串时,第一个测试将成功。因此,如果x
为0,则条件失败,但如果为“0”则成功。
当x
可转换为0时,第二个测试将成功。这意味着它不能为null,未定义或传递此测试的对象。它可能是“0”或“”。
换句话说,这些条件不是对立的。例如,值“0”将通过两个测试。
答案 6 :(得分:0)
如果x
为“falsy”值,则会执行代码片段1。在Javascript中,这意味着0,-0,null,undefined,NaN,“”或false。但是,代码片段2仅在x
为零时执行。与第一个条件不同,这不包括其他“假”值。
答案 7 :(得分:0)
经过一些查找后,必须更换我的芒果。 没有简单的逻辑,隐式相等操作遵循算法。 http://interglacial.com/javascript_spec/a-11.html#a-11.9.3
我无法总结它比算法描述的更好,它会变得更加混乱。
所以(!x)
相当于(typeof x === false)
又名(不是真实的)
(x == 0)
通过算法进行比较。