console.log(false === 0) // false
console.log(false === !1) // true, why does it equate to true using !?
反之亦然
console.log(true === 1 ) // false
console.log(true === !0) // true
我理解平等和身份之间的区别,但无法理解 JS 的这种行为。请解释 ?
console.log(false === 0) // false
console.log(false === !1) // true, why does it equate to true using !?
反之亦然
console.log(true === 1 ) // false
console.log(true === !0) // true
我理解平等和身份之间的区别,但无法理解 JS 的这种行为。请解释 ?
这===
要求两个值是相同的类型,不执行隐式强制。
当您将布尔值与带有三元组的数字进行比较时===
,您将始终得到错误,因为它们不是同一类型。
但是!
在数字(或其他任何东西)前面使用会先将其转换为布尔值,(与)!x
相同,!Boolean(x)
因此严格比较可以成功。(实际上,在任何东西上使用 ! 都会将其强制为 JS 中的布尔值)
数字到布尔转换的规则:
对于数字到布尔的转换,0
和NaN
被强制为false
,任何非零数都被强制为true
。(仅供参考,null
和undefined
空字符串''
是 JS 中唯一的其他虚假值)
现在,您将有两个布尔值进行比较, === 将相应地返回 true 或 false。
所以,总结一下:
在!1
, 1 是非零的,所以它被强制为true
,并!true
给出false
sofalse === !1
等价于false === false
,这是一个真实的陈述。
您可以计算出其他比较的详细信息。
作为附加资源,如果你有时间并且有兴趣了解更多,我推荐非常好的免费电子书《你不懂 JS》。
因为!1boolean
在 JS中被视为一个值,而0或1被解释为number
.
您可以使用 JStypeof !1
并typeof 0
查看差异。
由于,false
也是一种类型,因此将其与(number)boolean
匹配将产生.0
false
希望清除它。
当你这样做时false === 0
,它会将布尔值false
与整数进行比较0
。相反,当您这样做时false === !1
,javascript 会将整数转换1
为布尔值,而一元则!
充当对有效内容的“非”操作true
。由于1
在 javascript 中是真实的,因此!1
转换为false
. 反之亦然。
console.log(0) // 0
console.log(!0) // true
console.log(1) // 1
console.log(!1) // false
JavaScript 将首先将您的倒数转换为布尔值:
console.log(false === 0)
-> false
console.log(false === !1)
-> false === false
-> true
反之亦然
console.log(true === 1 )
-> false
console.log(true === !0)
-> true === true
-> true
你了解整数和布尔值的区别吗?
console.log(false === 0) // false
console.log(false === !1) // true
console.log(true === 1 ) // false
console.log(true === !0) // true
console.log(!1) // false
console.log(!0) // true
身份比较检查一个对象是否正是那个,1 不是true
,0 也不是false
。
因为 !运算符将任何值转换为布尔类型,并且您正在检查另一个布尔值,这就是为什么 false === !1 给您真实的原因。