以下所有的討論都要滿足一個條件切揭,就是用戶自己不自定義對象的toString方法和valueOf方法狞甚。
先預(yù)定義三個變量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();
};
當(dāng)使用Number()進(jìn)行強(qiáng)制類型轉(zhuǎn)換時
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
上面的代碼說明廓旬,當(dāng)使用Number()進(jìn)行強(qiáng)制類型轉(zhuǎn)換時哼审,當(dāng)參數(shù)為new Number()或者new String()時,調(diào)用valueOf函數(shù)孕豹;當(dāng)參數(shù)為{ }時涩盾,先調(diào)用valueOf函數(shù),再調(diào)用toString函數(shù)励背。
當(dāng)使用String()進(jìn)行強(qiáng)制類型轉(zhuǎn)換時
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]
上面的代碼說明春霍,當(dāng)使用String()進(jìn)行強(qiáng)制類型轉(zhuǎn)換時,對于new Number()叶眉,new String()和{ }址儒,都調(diào)用toString函數(shù)芹枷。