发现一个问题
maczyt opened this issue · 2 comments
maczyt commented
变量和数据类型
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"
stone0090 commented
这部分内容选自《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