首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >valueOf原型函数不工作的原因

valueOf原型函数不工作的原因
EN

Stack Overflow用户
提问于 2019-10-16 21:10:00
回答 2查看 66关注 0票数 1

这是我的代码

代码语言:javascript
复制
let user1 = {
  valueOf() {
    console.log(20);
    return 10;
  }
};
console.log(`${user1}`); // [object Object]

// user1.__proto__.toString

let user2 = {
  toString() {
    console.log(20);
    return 10;
  }
};
console.log(+user2); // 20 10

// user2.__proto__.valueOf ?????????

来自对象原型的user1 .__ proto __. toString函数第一次工作。为什么user2.__proto__.valueOf原型函数不能工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-16 21:23:05

为什么valueOf原型函数不能工作

我假设您是在问为什么不调用默认的valueOf方法?这实际上是被称为,但这并不是全部发生。

当将对象转换为原语时,将调用toStringvalueOf。首先调用哪一个取决于它应该转换成哪种原语。

当一个对象被转换为一个数字时,顺序是valueOftoString。如果toString不返回原语值,则调用valueOfvalueOf的默认实现就是这样,它返回对象本身:

代码语言:javascript
复制
var obj = {};
console.log(obj.valueOf() === obj)

知道了这一点,我们可以通过实现自己的valueOf来验证调用方法的顺序,但返回与缺省值相同的值:

代码语言:javascript
复制
let user2 = {
  valueOf() {
    console.log('valueOf');
    return super.valueOf();
  },
  toString() {
    console.log('toString');
    return 10;
  }
};
console.log(+user2); // 20 10

您的第一个示例user1不调用valueOf,因为

由于值被转换为字符串,方法的调用顺序是valueOf.

  • The,toString的默认实现返回一个基本值,因此算法停止,不尝试valueOf.

代码语言:javascript
复制
let user1 = {
  toString() {
    console.log('toString');
    return super.toString();
  },
  valueOf() {
    console.log('valueOf');
    return 10;
  }
};
console.log(`${user1}`);

规范的相关部分:

票数 1
EN

Stack Overflow用户

发布于 2019-10-16 21:14:04

模板字符串将表达式格式化为字符串,因此它调用user1.toString()

一元+运算符将其操作数转换为一个数字,这是一个原语值。因此,它使用user2.valueOf()来转换对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58421747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档