4
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 的这种行为。请解释 ?

4

7 回答 7

6

===要求两个值是相同的类型,不执行隐式强制。

当您将布尔值与带有三元组的数字进行比较时===您将始终得到错误,因为它们不是同一类型

但是!在数字(或其他任何东西)前面使用会先将其转换为布尔值,(与)!x相同,!Boolean(x)因此严格比较可以成功。(实际上,在任何东西上使用 ! 都会将其强制为 JS 中的布尔值)


数字到布尔转换的规则:

对于数字到布尔的转换,0NaN被强制为false,任何非零数都被强制为true。(仅供参考,nullundefined空字符串''是 JS 中唯一的其他虚假值)

现在,您将有两个布尔值进行比较, === 将相应地返回 true 或 false。

所以,总结一下:

!1, 1 是非零的,所以它被强制为true,并!true给出false

sofalse === !1等价于false === false,这是一个真实的陈述。

您可以计算出其他比较的详细信息。


作为附加资源,如果你有时间并且有兴趣了解更多,我推荐非常好的免费电子书《你不懂 JS》。

于 2018-07-30T13:02:15.393 回答
3

因为!1boolean在 JS中被视为一个值,而01被解释为number.

您可以使用 JStypeof !1typeof 0查看差异。

由于,false也是一种类型,因此将其与(number)boolean匹配将产生.0false

希望清除它。

于 2018-07-30T13:03:04.517 回答
2

当你这样做时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
于 2018-07-30T13:03:34.150 回答
2

!1是一个布尔值(因为逻辑非运算符 ( !))。
true也是false布尔值。
0是一个数字

不同类型的值永远不会相同 ( ===)

于 2018-07-30T13:03:37.813 回答
1

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
于 2018-07-30T13:03:08.177 回答
0

你了解整数和布尔值的区别吗?

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

于 2018-07-30T13:04:39.357 回答
0

因为 !运算符将任何值转换为布尔类型,并且您正在检查另一个布尔值,这就是为什么 false === !1 给您真实的原因。

于 2018-07-30T13:05:41.670 回答