以下所有的讨论都要满足一个条件,就是用户自己不自定义对象的toString方法和valueOf方法。
先预定义三个变量a,b,c。并修改它们的toString和valueOf方法
var a = new Number(123);
a.toString = function(){
console.log('call a.toString');
return new Number(123).toString();
};
a.valueOf = function(){
console.log('call a.valueOf');
return new Number(123).valueOf();
};
var b = new String('b-string');
b.toString = function(){
console.log('call b.toString');
return new String('b-string').toString();
};
b.valueOf = function(){
console.log('call b.valueOf');
return new String('b-string').valueOf();
};
var c = {}
c.toString = function(){
console.log('call c.toString');
return {}.toString();
};
c.valueOf = function(){
console.log('call c.valueOf');
return {}.valueOf();
};
当使用Number()进行强制类型转换时
var res = Number(a);//call a.valueOf
console.log(a);//123
var res = Number(b);//call b.valueOf
console.log(b);//NaN
var res = Number(c);/*call c.valueOf
call c.toString
*/
console.log(c);//NaN
上面的代码说明,当使用Number()进行强制类型转换时,当参数为new Number()或者new String()时,调用valueOf函数;当参数为{ }时,先调用valueOf函数,再调用toString函数。
当使用String()进行强制类型转换时
var res = String(a);//call a.toString
console.log(res);//123
var res = String(b);//call b.toString
console.log(res);//b-string
var res = String(c);//call c.toString
console.log(res);//[object Object]
上面的代码说明,当使用String()进行强制类型转换时,对于new Number(),new String()和{ },都调用toString函数。