object.is()对布尔值和null/undefined的判定与===一致,但通过修复+0/-0、nan等边界问题实现更高保真度,适用于状态检测等高精度场景。

Object.is() 能准确区分 true/false 与 null/undefined,但它本身并不“特殊处理”布尔值或空值——它的特异性来自其底层比较规则:严格相等(===)的增强版,尤其修复了 === 在 +0 与 -0、NaN 上的缺陷。对布尔值和空值而言,Object.is() 行为与 === 完全一致,但这种“一致性”恰恰是它可靠判定的基础。
布尔值:true 和 false 的精确识别
Object.is() 将 true 和 false 视为独立、不可互换的原始值。它不进行类型转换,也不接受“真值/假值”语义:
-
Object.is(true, true)→true -
Object.is(false, false)→true -
Object.is(true, 1)→false(类型不同,不转换) -
Object.is(false, '')→false(不会因“falsy”而判等)
null 与 undefined:明确区分彼此,且不与其他值混淆
Object.is() 严格保持 null 和 undefined 的身份独立性:
-
Object.is(null, null)→true -
Object.is(undefined, undefined)→true -
Object.is(null, undefined)→false(与==不同,绝不相等) -
Object.is(null, 0)→false,Object.is(undefined, false)→false
为什么说它“特异”?关键在边界场景的稳定性
真正体现 Object.is() 特异性的,不是它对布尔值或空值做了什么,而是它在所有边界情况下都拒绝隐式妥协:
- 不把
NaN当作“异常值”忽略:Object.is(NaN, NaN)是true(===返回false) - 区分数字符号:
Object.is(+0, -0)是false(===返回true) - 对布尔值和空值,虽行为同
===,但因整体规则统一,可安全用于需高保真判定的场景(如 React 的 Object.is 浅比较、状态变更检测)
实际使用建议
若目标是精准判断布尔状态或空值存在性,直接用 Object.is() 即可,无需额外封装:
- 检查是否显式设为
false:Object.is(value, false)(排除null、0、''等 falsy 值) - 确认是否为
null:Object.is(value, null)(比value === null语义更统一,尤其在工具函数中) - 避免误判
undefined为缺失属性:Object.is(obj.prop, undefined)比obj.prop === undefined更具可读一致性
它不创造新规则,而是以零容错的方式执行值的同一性判定——对布尔值与空值来说,这正是“特异性”的本质:不模糊、不妥协、不意外。










