为什么valueOf原型函数不起作用

时间:2019-10-16 21:10:00

标签: 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原型函数不起作用?

2 个答案:

答案 0 :(得分:1)

模板字符串将表达式格式化为字符串,因此调用f.seek(0)

一元Sub Test() LR = 10 Do Until LR = 20 'Inside the loop you can use Exit Sub if a condition is meet before LR = 20 If LR > 20 Then Exit Sub End If LR = LR + 1 Loop End Sub 运算符将其操作数转换为数字,这是原始值。因此它使用user1.toString()来转换对象。

答案 1 :(得分:1)

  

为什么valueOf原型函数不起作用

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

将对象转换为基元时,将调用toStringvalueOf。首先调用哪个,取决于应将其转换为哪种原语。

将对象转换为数字时,顺序为valueOftoString。如果toString不返回原始值,则会调用valueOfvalueOf的默认实现就是这种情况,它返回对象本身:

var obj = {};
console.log(obj.valueOf() === obj)

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

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


您的第一个示例user1之所以没有调用valueOf是因为

  1. 由于将值转换为字符串,因此方法的调用顺序为toStringvalueOf
  2. toString的默认实现返回一个原始值,因此算法在此处停止并且不尝试valueOf

let user1 = {
  toString() {
    console.log('toString');
    return super.toString();
  },
  valueOf() {
    console.log('valueOf');
    return 10;
  }
};
console.log(`${user1}`);


规范的相关部分: