js高级程序设计第三版
关于数值转换的描述
如果是NaN不行应该执行toString么 怎么会打印出NaN?
我的理解是这样,希望对你有所帮助!
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。
var box = {
valueOf: function() {
return 1;
},
toString: function() {
return "toString";
}
};
console.log(Number(box)); //1
console.log(String(box)); //toString
* 当使用`Number`时,调用的其实是其内部的`valueOf`方法,返回一个`1`,这样`Number`本身也要对返回值进行一次检查,如果你返回的不是`number`类型的,当然检测出来就是`NaN`,当然这个方法也可以重写
* 使用`String`也是同上理解,不过不会出现`NaN`而已。
前面的规则说明了,如果是对象则调用ValueOf()方法,这时候调用valueOf()方法已经返回'abc',然后再依照前面的规则,规则第五条,所以返回NAN
另外,命理难说 回答地很详细!
var box = {
valueOf() {
return 'abc';
},
toString() {
return '1233';
},
};
console.log(Number(box));
==>
var box = {
valueOf() {
return 'abc';
},
toString() {
return '1233';
},
};
var boxValue=Number(box);
console.log(boxValue);
Number作为普通函数调用时,将执行类型转换
转换规则,先调用对象的valueOf方法,如果能返回一个基本类型(原始类型),那么返回这个原始类型,再根据原始类型到number类型的转换规则执行转换,不能转换成数字,那么返回NaN。
如果valueOf不能不能返回基本类型,那么转而去调用toString方法,如果这个方法能返回原始类型,再根据原始类型到number类型的转换规则执行转换,不能转换成数字,那么抛出类型错误Uncaught TypeError: Cannot convert object to primitive value
var box = {
valueOf() {
return {};
},
toString() {
return {};
},
};
var boxValue=Number(box);//Uncaught TypeError: Cannot convert object to primitive value
console.log(boxValue);
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
转换规则如下:
综上所诉
以上就只调用了valueOf,因为valueOf返回的是基本类型数据。
以上两个方法都调用了,因为valueOf返回的不是基本类型,所以在调用一次toString
同理 你可以在测试一下两个方法返回的都是复杂类型数据的时候结果是什么