首页 > 解决方案 > 什么时候方法 valueOf 可能不存在?

问题描述

我有这个代码。而且我不明白它是如何工作的。

let obj = {
    valueOf: function () {
        return {};
    },
    toString: function () {
        return 222;
    }
};

console.log(Number(obj)); //222

根据这个来源,转换算法是:

  1. obj[Symbol.toPrimitive](hint)如果方法存在则调用,
  2. 否则,如果提示是“字符串”,则尝试obj.toString()obj.valueOf(),无论是否存在。
  3. 否则,如果提示是“数字”或“默认”尝试obj.valueOf()obj.toString(),无论存在。

提示是这里的数字。那为什么obj.toString()叫呢?没有obj.valueOf()吗?为什么?什么样的对象有这个方法?我找不到任何有用的信息。

这是另一个例子:

var room = {
  number: 777,

  valueOf: function() { return this.number; },
  toString: function() { return 255; }
};

console.log( +room );  // 777

为什么obj.valueOf()在这种情况下调用?为什么这里存在这种方法,而在第一个示例中却没有?它是如何工作的?

标签: javascriptobjecttostringvalue-of

解决方案


从您引用的文章中:

返回类型

…<br /> 唯一的强制性要求:这些方法必须返回一个原语,而不是一个对象。

历史注释
由于历史原因,如果toStringvalueOf返回一个对象,则没有错误,但该值被忽略(就像该方法不存在时一样)。

在您的第一个片段中,两种方法都存在并被尝试:首先obj.valueOf(),但由于它返回一个空对象而不是原始值,obj.toString()因此也被调用。

在您的第二个代码段中,obj.valueOf()已经返回 number 777,这将成为结果。


推荐阅读