輸出對(duì)象先toString再valueOf
先調(diào)用toString,若返回基礎(chǔ)類型,則輸出
var test = {
toString:function () {
console.log('toString');
return 1;
},
valueOf:function () {
console.log('valueOf');
return 2;
}
}
alert(test);
// toString
// 彈出1
若toString返回的不是基礎(chǔ)類型,則繼續(xù)調(diào)用valueOf
var test = {
toString:function () {
console.log('toString');
return {};
},
valueOf:function () {
console.log('valueOf');
return 2;
}
}
alert(test);
// toString
// valueOf
// 彈出2
若兩者都返回非基礎(chǔ)類型值,則拋出異常
var test = {
toString:function () {
console.log('toString');
return {};
},
valueOf:function () {
console.log('valueOf');
return {};
}
}
alert(test);
// toString
// valueOf
// Uncaught TypeError: Cannot convert object to primitive value
參與運(yùn)算先valueOf再toString
先調(diào)用valueOf,若返回基礎(chǔ)類型,則進(jìn)行運(yùn)算
var test = {
toString:function () {
console.log('toString');
return 1;
},
valueOf:function () {
console.log('valueOf');
return 2;
}
}
alert(test + 1);
// valueOf
// 彈出3
若valueOf返回非基礎(chǔ)類型,則繼續(xù)調(diào)用toString
var test = {
toString:function () {
console.log('toString');
return 1;
},
valueOf:function () {
console.log('valueOf');
return {};
}
}
alert(test + 1);
// valueOf
// toString
// 彈出2
若兩者返回均為非基礎(chǔ)類型,則拋出異常
var test = {
toString:function () {
console.log('toString');
return {};
},
valueOf:function () {
console.log('valueOf');
return {};
}
}
alert(test + 1);
// valueOf
// toString
// Uncaught TypeError: Cannot convert object to primitive value
應(yīng)用
- == 比較
若對(duì)象和字符串或者數(shù)值比較,則先要將對(duì)象先轉(zhuǎn)換成基礎(chǔ)類型再進(jìn)行比較var a = {a:1}; a.valueOf = a.toString = function () { return 1; } a == '1' // true
- add(2)(3)(4)
function add(arg){ var sum = arg, result = function (b) { sum += b; return result; } result.valueOf = result.toString = function(){ return sum; } return result; } add(2)(3)(4)