首页 > 解决方案 > 在任何情况下,`x.valueOf() === x` 可能会返回 `false`?

问题描述

我试图理解这种valueOf()方法。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf

是否存在任何类型的变量都可能返回false以进行以下检查的情况?

x.valueOf() === x

const obj = {};
const str = "abc";
const strNum = "123";
const number = 123;
const arrStr = ["a","b","c"];
const arrNum = [1,2,3];

console.log(obj.valueOf() === obj);
console.log(str.valueOf() === str);
console.log(strNum.valueOf() === strNum);
console.log(number.valueOf() === number);
console.log(arrStr.valueOf() === arrStr);
console.log(arrNum.valueOf() === arrNum);

标签: javascriptprimitiveprimitive-typesvalue-of

解决方案


具有自定义valueOf方法的变量可能会返回未通过测试的值:

const obj = {
  valueOf() {
    return NaN;
  }
};
console.log(obj.valueOf() === obj);

包裹在对象中的数字也会返回 false:

const obj = new Number(5);
console.log(obj.valueOf() === obj);

MDN 文档看起来具有误导性。Object.prototype.valueOf将返回一个对象或抛出一个错误 - 请参阅规范

请记住,当调用valueOf非对象时,例如数字/字符串/布尔值,您将调用该特定原语valueOf的方法(例如),而不是.Number.prototype.valueOfObject.prototype.valueOf


推荐阅读