我在玩JSconsole时发现了一些奇怪的东西。"0"
的值为false
"0" == false
=> true
false
的值在三进制中使用时返回第二个值
false ? 71 : 16
=> 16
但是,值"0"
在三进制中等于false
时返回第一个值。
"0" ? 8 : 10
=> 8
但是,如果使用0
作为值,则返回第二个值
0 ? 4 : 5
=> 5
0 == "0"
=> true
恐怕这对我来说没有意义。 非空字符串在条件语句、条件表达式和条件构造中被认为是真值。
但是当你用==
比较字符串和数字时,会发生一些转换。
当比较数字和字符串时,将字符串转换为 。JavaScript尝试将字符串转换为数字字面值转换为数字类型值。首先,推导出一个数学值从字符串数字字面值。接下来,该值四舍五入到最接近的数字类型值。
和==
不具有相等传递性质:
你不能说if a == b, b == c, then a == c
。
一个例子是:
"0" == false // true
false == "n" //true
猜猜"0" == "n"
的结果?是的,结果是false
。
"0"
是长度为>0
的字符串,即true
。试着
0 ? 8 : 10
看看。它将返回10
。
==
执行类型转换,因此当执行
"0" == false
返回true
。当你做
0 == "0" //true
当再次发生类型转换时,它也返回true。即使一个是number
,另一个是string
,它也返回true。但是如果您使用===
, 没有类型转换完成,0 === "0"
将返回false
。
==
&===
给出这里
相等运算符(
==
)对不相同类型的操作数进行转换,然后应用严格比较。如果操作数严格相等且没有类型转换,则标识操作符(
===
)返回true。
恐怕这是为什么你应该使用===
的一个例子-普通的旧==
执行类型转换。试着
"0"===false
JavaScript导致大量wtf。
查看YouTube上的"Javascript WTF"…
实际上,您正在请求从字符串到布尔值的转换。
这被定义为"string is not empty"。
而你假设javascript做string -> int ->布尔如果字符串碰巧包含一个数字。
是明智的。但是这些自动转换会导致编程错误,这就是为什么我更喜欢在大型项目中使用类型安全语言(带有编译时类型检查)的原因。
为了好玩,试试这些:
("0" * 1) ? 71 : 16
("0" + false) ? 71 : 16