前端知库

JavaScript 的值类型与相等比较应该怎样理解?

参考答案

JavaScript 的原始类型包括 undefined、null、boolean、number、bigint、string、symbol;对象包括普通对象、数组和函数等。变量保存值,对象值具有身份;两个内容相同但分别创建的对象并不相等。

=== 不做隐式类型转换,NaN 与自身比较为 false,+0 与 -0 相等。Object.is 认为 NaN 与自身相等,但区分正负零。Set、Map 使用的 SameValueZero 则把 NaN 视为相同、把正负零视为相同。

业务代码通常优先使用严格比较,并对输入做明确归一化。不要用 typeof null 判断空值,也不要把“对象存于堆、基本类型存于栈”当成语言规范保证;那是实现层面的简化描述。

可运行示例

JavaScript
console.log(NaN === NaN);
console.log(Object.is(NaN, NaN));
console.log(Object.is(+0, -0));
console.log(new Set([NaN, NaN, +0, -0]).size);

输出依次为:false、true、false、2。