stone0090/javascript-lessons

发现一个问题

maczyt opened this issue · 2 comments

变量和数据类型

object 先则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的toString() 方法,然后再次依照前面的规则转换返回的字符串值

var testNumber = {
  valueOf: function () {
    return 'This is string'
  },
  toString: function () {
    return '123'
  }
}

isNaN(testNumber) // true

按着这条所写,应该返回false,因为123并不是NaN

sytu commented

没错, 123确实不是NaN. 但是toString方法返回的是字符串"123"不是数值123.

typeof testNumber.toString()  //"string"

这部分内容选自《JavaScript 高级编程》,确实有些问题,我重新参考了《JavaScript 权威指南》,正确过程如下:

  • 如果对象具有 valueOf() 方法,且返回一个原始值(5种简单数据类型),则将这个原始值转换为数字,并返回这个数字。
  • 否则,如果对象具有 toString() 方法,且返回一个原始值,则将这个原始值转换为数字,并返回这个数字。
  • 否则,抛出一个类型错误异常。

下面代码可以很好的解释以上3种情况:

var test1 = {
  valueOf: function () {
    return 'This is string';
  },
  toString: function () {
    return '123';
  }
};
console.log(Number(test1)); // NaN

var test2 = {
  valueOf: function () {
    return {};
  },
  toString: function () {
    return '123';
  }
};
console.log(Number(test2)); // 123

var test3 = {
  valueOf: function () {
    return {};
  },
  toString: function () {
    return {};
  }
};
console.log(Number(test3)); // Uncaught TypeError: Cannot convert object to primitive value