【问题标题】:When the method valueOf may be absent?当方法 valueOf 可能不存在时?
【发布时间】:2021-08-28 06:29:44
【问题描述】:

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

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

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

根据这个source,转换算法是:

  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()?为什么这里存在这种方法,而在第一个示例中却没有?它是如何工作的?

【问题讨论】:

    标签: javascript object tostring value-of


    【解决方案1】:

    来自您引用的文章:

    Return types


    唯一强制性的事情:这些方法必须返回一个原语,而不是 一个对象。

    历史笔记
    由于历史原因,如果toStringvalueOf 返回一个对象, 没有错误,但是这样的值被忽略了(就像方法没有 存在)。

    在您的第一个 sn-p 中,两种 方法都存在并且被尝试过:首先是obj.valueOf(),但由于它返回一个空对象而不是原始值,@987654325 @ 也被调用。

    在您的第二个 sn-p 中,obj.valueOf() 已经返回了数字 777,这就是结果。

    【讨论】:

    • "obj.valueOf(),whatever exists","obj.toString(),whatever exists"...其实这些在什么情况下方法不能存在?只是出于好奇
    • @Ivan Object.create(null), {valueOf: null, toString: undefined}
    • 我明白了。我只需要取消这些方法。但我还有一个问题。 obj[Symbol.toPrimitive] 何时存在?我看到简单对象中几乎没有obj[Symbol.toPrimitive]。那么,这种方法在什么情况下可以呢?
    • @Ivan DateSymbol 实例都有该方法,您也可以在自己的对象和自定义类上定义它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2020-11-16
    • 1970-01-01
    • 2011-06-25
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多