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。