我一直认为JavaScript的if
语句对他们的论点做了某种投射魔术,但我对幕后的实际情况有点警惕。
我最近发现JavaScript comparison table并注意到即使-1 == true
评估为false
,if(-1){...}
也会执行。
因此,在JavaScripts if
语句中,表达式会发生什么?假设它使用!!{expression}
将其转换为反布尔值,然后再将其反转,似乎是合理的,但如果是这种情况,JS如何判断对象的反布尔表示是否真实?
答案 0 :(得分:5)
JavaScript很不可靠。
是的,-1 == true
会导致错误,但这不是if语句的作用。它正在检查语句是否“真实”,或转换为true。在JavaScript中,这相当于!!-1
,其中 导致为真(除零以外的所有数字都是真实的)。
The spec defines double equals运算符在出现数字和布尔值时执行以下操作:
如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
ToNumber会将布尔值true
转换为数字1
,因此您需要进行比较:
-1 == 1
任何人都能告诉你的事实显然是错误的。
另一方面,if
语句正在调用ToBoolean
,它会将任何非零,非NaN号码视为true
。
答案 1 :(得分:2)
任何JavaScript开发人员都需要查看文档 - 对于这种情况,位于此处:http://www.ecma-international.org/ecma-262/5.1/#sec-9.2
9.2 ToBoolean
抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:
(抱歉格式化,无法在此处制作表格。)
答案 2 :(得分:1)
来自JavaScript The Definitive Guide
以下值转换为false
undefined
一样工作
null
0
-0
NaN
""
true
//空字符串所有其他值,包括所有对象(和数组)都转换为false
,并像{{1}}一样工作。 {{1}}以及转换为它的六个值有时称为 falsy 值,所有其他值都称为 truthy 。
答案 3 :(得分:1)
这些东西本身就是假的(或评价为假):
其他所有其他事情。
在评估预期结果为真或假(假)的情况时,会使用Truthy-ness或falsy-ness。
在您的示例if(-1 == true)
中,您正在比较苹果和橙子。首先评估比较(并导致错误),并在您的条件中使用该结果。 truthyness / falsyness的概念并不适用于比较操作数。
答案 4 :(得分:0)
如果状态使用比较变量不同类型js使用.toString和.valueOf(有关更多信息,请检查http://javascript.info/tutorial/object-conversion) - 请记住这一点 - 这样做更容易理解