P粉3365367062023-08-24 09:01:58
==
运算符(相等)true == 1; //true, because 'true' is converted to 1 and then compared "2" == 2; //true, because "2" is converted to 2 and then compared
===
运算符(Identity)true === 1; //false "2" === 2; //false
这是因为相等运算符 ==
会进行类型强制转换,这意味着解释器会在比较之前隐式尝试转换值。
另一方面,恒等运算符 ===
不会进行类型强制,因此在比较时不会转换值。
P粉1788942352023-08-24 00:58:02
严格相等运算符 (===
) 的行为与抽象相等运算符 (==
) 相同,只是不进行类型转换,并且类型必须是相同的被认为是平等的。
==
运算符将在进行任何必要的类型转换后比较是否相等。 ===
运算符不会进行转换,因此如果两个值不是同一类型,===
将简单地返回 假
。两者都同样快。
引用 Douglas Crockford 的精彩JavaScript:好的部分一个>,
@Casebash 在评论和@Phillipe Laybaert 的 关于对象的答案。对于对象,==
和 ===
彼此行为一致(特殊情况除外)。
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
构造函数从字符串文字创建字符串对象。
参考
https://262.ecma-international.org/5.1/#sec-11.9 .3