我正在阅读一本关于 JavaScript 的好书。
它开始于:
Boolean 类型只接受两个字面值:true 和 false。它们与数值不同,所以 true 不等于 1,false 不等于 0。
但是,我观察到以下内容:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
我知道,JavaScript 中的每种类型都有对应的布尔值。
但是,真相是什么?
我正在阅读一本关于 JavaScript 的好书。
它开始于:
Boolean 类型只接受两个字面值:true 和 false。它们与数值不同,所以 true 不等于 1,false 不等于 0。
但是,我观察到以下内容:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
我知道,JavaScript 中的每种类型都有对应的布尔值。
但是,真相是什么?
确实,true
并且false
不代表 Javascript 中的任何数值。
在某些语言(例如 C、VB)中,布尔值被定义为实际数值,因此它们只是 1 和 0(或 -1 和 0)的不同名称。
在其他一些语言(例如 Pascal、C#)中,有一种独特的布尔类型,它不是数字。可以在布尔值和数值之间进行转换,但不会自动发生。
Javascript 属于具有独特布尔类型的类别,但另一方面,Javascript 非常热衷于在不同数据类型之间转换值。
例如,即使数字不是布尔值,您也可以在需要布尔值的地方使用数值。使用if (1) {...}
效果和if (true) {...}
.
==
在比较值时,例如在您的示例中,运算符和运算符之间存在差异===
。相等运算符很乐意在==
类型之间进行转换以找到匹配项,因此1 == true
计算结果为 true,因为true
已转换为1
. ===
类型相等运算符不进行类型转换,因此1 === true
计算结果为 false,因为值的类型不同。
在 JavaScript 中,== 发音为“可能等于”。
我的意思是 JavaScript 会自动将布尔值转换为整数,然后尝试比较两侧。
对于真正的相等,使用 === 运算符。
尝试严格的相等比较:
if(1 === true)
document.write("oh!!! that's true"); //**this is not displayed**
==
运算符会从一种类型转换为另一种类型,而运算===
符则不会。
来自 ECMAScript 规范,第11.9.3 节抽象相等比较算法:
比较 x == y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:
- 如果 Type(y) 是布尔值,则返回比较结果x == ToNumber(y)。
因此, in, if (1 == true)
,true
被强制转换为 a Number
,即Number(true)
,这导致 的值1
,产生最终if (1 == 1)
结果是true
。
if (0 == false)
是完全相同的逻辑,因为Number(false) == 0
.
当您使用严格的等于运算符时,不会发生这种情况===
:
比较 x === y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:
- 如果 Type(x) 与 Type(y) 不同,则返回false。
啊,可怕的松散比较运算符又来了。永远不要使用它。始终使用严格比较,=== 或 !== 代替。
奖金事实:0 == ''
当将某些东西与布尔值进行比较时,它的工作原理如下
第 1 步:转换boolean
为Number
Number(true) // 1
和Number(false) // 0
第 2 步:比较双方
boolean == someting
-> Number(boolean) === someting
如果1
和你2
比较true
会得到以下结果
true == 1
-> Number(true) === 1
-> 1 === 1
-> true
和
true == 2
-> Number(true) === 1
-> 1 === 2
-> false
实际上,如果 javascript 中的每个对象都像 W3Cschools 所说的那样具有“真正的价值”,它就会解析为 true。这意味着除""
, NaN
,或undefined
之外的所有内容。null
0
用运算符测试一个数字与布尔值==
确实有点奇怪,因为布尔值在比较之前被转换为数字 1,这有点违背定义背后的逻辑。当您执行以下操作时,这会变得更加混乱:
var fred = !!3; // will set fred to true
var joe = !!0; // will set joe to false
alert("fred = "+ fred + ", joe = "+ joe);
并非 javascript 中的所有内容都很有意义;)
用于===
使变量相等,而不是==
.
==
检查变量的值是否相似
===
检查变量的值和变量的类型是否相似
注意如何
if(0===false) {
document.write("oh!!! that's true");
}
和
if(0==false) {
document.write("oh!!! that's true");
}
给出不同的结果
使用 == 您本质上是在比较变量与 false 比较时是否为 false 或与 true 比较时是否为 true。如果您使用 ===,它将比较变量的确切值,因此 true 不会 === 1