【问题标题】:Object to primitive conversion in Javascript: Please why isn't the valueOf() method called since there is not toString() methodJavascript中的对象到原始转换:为什么不调用valueOf()方法,因为没有toString()方法
【发布时间】:2020-07-10 02:03:41
【问题描述】:

let obj = {
  valueOf() {
    return "2";
  }
};

alert(obj);

我认为在没有 toString() 的情况下,valueOf() 将在需要字符串时被调用。

【问题讨论】:

  • 为什么你认为 alert 需要一个原语? +obj 给了2,正如预期的那样
  • alert() 不总是将它的参数转换为字符串吗?
  • @jonrsharpe 实际上我确实看到它确实调用 valueOf 如果它没有找到 toString 方法,请查看我的答案。因为这里我们没有创建一个纯对象,所以它在原型上找到 toString 并且不会调用 valueOf。
  • 感谢您的链接。我在其中读到,当需要一个字符串值时,将调用 toString(),而 alert() 就是这种情况。但是既然没有 toString() 不应该依靠 valueOf() 吗?

标签: javascript object tostring primitive value-of


【解决方案1】:

这不会调用,因为它在原型链中找到toString,如果我们创建一个没有任何原型的对象,它将调用

let obj = Object.create(null)

obj.valueOf =
  function() {
    return "2";
  }

alert(obj);

【讨论】:

  • 好吧,我知道每个对象都有 toString() 作为 [object Object] 即使我没有将它作为属性添加到对象中。所以你的意思是如果我调用 Object.create(null) 它会删除 toString() 原型?
  • @Israel 是的,这用于将原型设置为 null,或者通常称为纯对象
  • 如果是这种情况,那么如果我用 toString() 替换问题中的 valueOf() 并且我将 alert() 更改为需要数字而不是数字的语句,为什么会调用 toString()字符串
  • @Israel 它在原型链中搜索 toString 所以如果你的对象有 toString 它只是调用那个函数,如果没有然后它搜索原型如果找到调用那个函数如果没有然后它调用 valueOf跨度>
  • 好的,我明白了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多