先說結論:運算操做(+|-|*|÷)時,對象的valueOf屬性會先被調用,默認的valueOf屬性會隱性地調用toString方法。code
var a = { toString: function() { console.log("in a.toString"); return "|_a->toString_|"; }, valueOf: function() { console.log("in a.valueOf"); return "|_a->valueOf_|"; } }; alert(a); //控制檯-> in a.toString //彈窗-> |_a->toString_|
結論1:alert方法只是單獨直接調用toString方法;對象
var a = { toString: function() { console.log("in a.toString"); return "|_a->toString_|"; }, valueOf: function() { console.log("in a.valueOf"); return "|_a->valueOf_|"; } }; ""+a; //控制檯-> in a.valueOf ""-a; //控制檯-> in a.valueOf ""*a; //控制檯-> in a.valueOf ""/a; //控制檯-> in a.valueOf
結論2:運算符會調用對象的valueOf方法;io
var a = { /// toString: function() { // console.log("in a.toString"); // return "|_a->toString_|"; // }, valueOf: function() { console.log("in a.valueOf"); return "|_a->valueOf_|"; } }; ""+a; //控制檯-> in b.valueOf ""-a; //控制檯-> in b.valueOf ""*a; //控制檯-> in b.valueOf ""/a; //控制檯-> in b.valueOf
結論3:操做符默認不會調用toString方法;console
var a = { toString: function() { console.log("in a.toString"); return "|_a->toString_|"; }, /// valueOf: function() { // console.log("in a.valueOf"); // return "|_a->valueOf_|"; // } }; ""+a; //控制檯-> in b.toString ""-a; //控制檯-> in b.toString ""*a; //控制檯-> in b.toString ""/a; //控制檯-> in b.toString
結論4:默認的valueOf會調用toString方法;function
總結:
alert():只調用toString
運算符:只調用valueOf
valueOf(默認):會調用valueOf方法