查看这些测试:
3 回答
这是javascript必须做的===
:
- 如果 Type(x) 与 Type(y) 不同,则返回 false。
- 如果 Type(x) 未定义,则返回 true。
- 如果 Type(x) 为 Null,则返回 true。
- 如果 Type(x) 是 Number,那么
- 如果 x 是 NaN,则返回 false。
- 如果 y 是 NaN,则返回 false。
- 如果 x 与 y 的数值相同,则返回 true。
- 如果 x 为 +0 且 y 为 -0,则返回 true。
- 如果 x 为 -0 且 y 为 +0,则返回 true。
- 返回假。
- 如果 Type(x) 是 String,则如果 x 和 y 是完全相同的字符序列(相同的长度和对应位置的相同字符),则返回 true;否则,返回假。
- 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回假。
- 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。
这就是它必须做的事情==
:
- 如果 Type(x) 与 Type(y) 相同,则
- 如果 Type(x) 未定义,则返回 true。
- 如果 Type(x) 为 Null,则返回 true。
- 如果 Type(x) 是 Number,那么
- 如果 x 是 NaN,则返回 false。
- 如果 y 是 NaN,则返回 false。
- 如果 x 与 y 的数值相同,则返回 true。
- 如果 x 为 +0 且 y 为 -0,则返回 true。
- 如果 x 为 -0 且 y 为 +0,则返回 true。
- 返回假。
- 如果 Type(x) 是字符串,那么如果 x 和 y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回 true。否则,返回假。
- 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真。否则,返回假。
- 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。
- 如果 x 为 null 且 y 未定义,则返回 true。
- 如果 x 未定义且 y 为空,则返回 true。
- 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
- 如果 Type(x) 是 String 并且 Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
- 如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
- 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
- 如果 Type(x) 是 String 或 Number 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
- 如果 Type(x) 是 Object 并且 Type(y) 是 String 或 Number,则返回 ToPrimitive(x) == y 的比较结果。
- 返回假。
请注意,如果Type(x)
等于Type(y)
,则运算符执行相同的操作。但是,如果不是,则==
可能必须进行各种转换,而===
只返回 false。
对于您提供的链接,正在比较的类型实际上是相同的,因此两个运算符的性能应该大致相同。这里的差异将基于实现细节——因为它们做不同的事情,它们可以针对不同的方式进行优化。从理论上讲,由于===
做的更少,人们会认为它总是会更快,但对于某些版本的 Firefox 似乎并非如此,至少如果这些基准是准确的。
但是,如果类型不同,请查看差异。执行此操作时,"hi" === {}
您可以获得约 6600 万次操作/秒,但"hi" == {}
您只有约 400 万次操作/秒。
JavaScript 是一种弱类型语言,因此它会尽可能地应用类型强制。
等于运算符
// These are true
new Number(10) == 10; // Number.toString() is converted
// back to a number
10 == '10'; // Strings gets converted to Number
10 == '+10 '; // More string madness
10 == '010'; // And more
isNaN(null) == false; // null converts to 0
// which of course is not NaN
严格等式运算符
它与普通的相等运算符一样工作,只是严格相等运算符不在其操作数之间执行类型强制。
"" === "0" // false
0 === "" // false
0 === "0" // false
false === "false" // false
false === "0" // false
false === undefined // false
false === null // false
null === undefined // false
" \t\r\n" === 0 // false
上面的结果更加清晰,并允许早期破坏代码。这在一定程度上强化了代码,并且在操作数属于不同类型的情况下也提高了性能。
所以 === 比 JavaScript 中的 == 快
这是很好的参考
=== 比较值和类型是否相同。
== 比较值是否相同,但它也在比较中进行类型转换。这些类型转换使 == 比 === 慢。