JS === 与 ==
严格相等运算符(===
)的行为与抽象相等运算符(==
)相同,不同之处在于未进行任何类型转换,并且类型必须相同才能被视为相等。
参考:Javascript教程:比较运算符
进行任何必要的类型转换后,==
运算符将比较是否相等。该运营商将不会进行转换,因此,如果两个值是不一样的类型将简单地返回。两者都同样快。===
===
false
引用Douglas Crockford出色的JavaScript:The Good Parts,
JavaScript有两组相等运算符:
===
和!==
,以及它们的邪恶孪生子==
和!=
。优秀的产品以您期望的方式工作。如果两个操作数具有相同的类型并具有相同的值,则===
产生true
和!==
产生false
。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但是如果操作数是不同类型,则它们会试图强制值。他们所遵循的规则是复杂而难忘的。这些是一些有趣的情况:
'' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true
传递性的缺乏令人震惊。我的建议是不要使用邪恶的双胞胎。相反,请始终使用
===
和!==
。刚刚显示的所有比较都是false
由===
操作员进行的。
关于对象的回答中提出了一个很好的观点。对于对象,==
并===
彼此一致行动(除非在特殊情况下)。
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // false
a === b // false
c == d // false
c === d // false
e == f // true
e === f // true
特殊情况是,当您比较一个基元和一个对象时,由于该对象toString
或valueOf
方法的原因,该对象的结果等于相同的基元。例如,考虑将字符串基元与使用String
构造函数创建的字符串对象进行比较。
"abc" == new String("abc") // true
"abc" === new String("abc") // false
在这里,==
操作员正在检查两个对象的值并返回true
,但是===
看到它们不是同一类型并返回false
。哪一个是正确的?这确实取决于您要比较的内容。我的建议是完全绕过该问题,只是不要使用String
构造函数从字符串文字中创建字符串对象。
转发无需备注,如有错误,恳求读者指出,发送到wu13213786609@outlook.com。