面试题答案
一键面试ECMAScript 5 和 ECMAScript 6 规范下对象与原始值比较规则
NaN 比较
- ECMAScript 5:NaN 与任何值(包括它自身)比较都返回 false。例如:
console.log(NaN === NaN); // false
- ECMAScript 6:在 Object.is 方法中,NaN 与自身比较返回 true。但在 == 和 === 比较中,行为和 ES5 一致。例如:
console.log(Object.is(NaN, NaN)); // true
console.log(NaN === NaN); // false
复杂对象结构比较
- ECMAScript 5:对象与原始值比较时,对象会通过 valueOf 和 toString 方法尝试转换为原始值,然后进行比较。例如:
const obj = {
valueOf: function() {
return 10;
}
};
console.log(obj == 10); // true
- ECMAScript 6:基本规则与 ES5 类似,但在严格相等(===)比较中,对象和原始值永远不相等,即使对象转换后的原始值与比较的原始值相同。例如:
const obj = {
valueOf: function() {
return 10;
}
};
console.log(obj === 10); // false
浏览器和 Node.js 环境中可能出现的不一致情况及原因
不一致情况
在浏览器和 Node.js 环境中,对于对象与原始值比较的不一致情况可能出现在自定义对象的 toString 或 valueOf 方法被重写的场景下。由于不同环境对某些内置对象的默认实现可能略有不同,可能导致比较结果不一致。例如,某些浏览器环境对 Date 对象的 toString 方法返回值格式与 Node.js 略有差异,当 Date 对象与字符串比较时,可能出现不同结果。
原因
- 环境差异:浏览器和 Node.js 是不同的运行环境,它们对某些内置对象的实现可能基于不同的历史原因和设计考量。
- 引擎差异:不同的 JavaScript 引擎(如 V8 用于 Chrome 和 Node.js,SpiderMonkey 用于 Firefox 等)在遵循 ECMAScript 规范的同时,可能存在一些细微的实现差异,这也可能导致对象与原始值比较行为的不一致。