本指南深入研究了 JavaScript 严格相等运算符 (===
) 的复杂性,如 ECMAScript 规范的“严格相等比较”部分中所定义。 让我们逐步探索它的功能:
===
算法:详细了解===
运算符采用以下算法来确定相等性:
类型检查: 运算符首先比较两个值的类型。如果类型不同,它立即返回false
。 仅当类型相同时,类型匹配才会进入下一步。
特定类型比较:
数字:
NaN === NaN
评估为 false
(分歧的关键点)。true
. 0
和 -0
被视为相等 (true
)。字符串:逐个字符比较确定相等。 相同的序列产生 true
;否则,false
。
布尔值: true === true
和 false === false
都返回 true
。 否则,false
。
对象(包括数组和函数): ===
检查引用相等性。 只有当两个值都指向相同的内存位置(同一个对象)时,它才会返回 true
.
null
和 undefined
: null === null
和 undefined === undefined
返回 true
。然而,由于类型差异,null === undefined
是 false
。
NaN === NaN
是false
这是一个常见的混乱来源。 该规范将 NaN
(非数字)定义为与其自身不相等。这是因为 NaN
代表无效或未定义的数值结果;将两个未定义的结果视为相等缺乏逻辑连贯性。
示例:
NaN === NaN; // false
要可靠地检查 NaN
,请使用 Number.isNaN()
或 Object.is()
:
Number.isNaN(NaN); // true Object.is(NaN, NaN); // true
0 === -0
是true
规范将 0
和 -0
视为等效,因为在大多数数学运算中,它们的行为是无法区分的。 然而,在特定场景中存在细微的差异(例如,1 / 0
产生 Infinity
,而 1 / -0
产生 -Infinity
)。 对于需要区分的情况,请使用 Object.is()
:
NaN === NaN; // false
在比较对象时,===
评估参考等效。除非它们是内存中的对象相同的对象,否则两个具有相同内容的对象是不相等的:
Number.isNaN(NaN); // true Object.is(NaN, NaN); // true
Object.is(+0, -0); // false
以上是解开 JavaScript 的'===”的详细内容。更多信息请关注PHP中文网其他相关文章!