先说结论:运算操做(+|-|*|÷)时,对象的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方法