全面解析JavaScript中的valueOf与toString方法(推荐)
可以这样说,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。在程序应用非常广泛。下面我们逐一来给大家介绍下。
JavaScript的valueOf()方法
valueOf()方法可返回Boolean对象的原始值。
用法booleanObject.valueOf(),返回值为booleanObject的原始布尔值。如果调用该方法的对象不是Boolean,则抛出异常TypeError。
<scripttype="text/javascript"> varboo=newBoolean(false); document.write(boo.valueOf()); </script>
以上脚本会输出false。
JavaScript的toString()方法
toString()方法可把一个逻辑值转换为字符串,并返回结果。
用法booleanObject.toString(),返回值根据原始布尔值或者booleanObject对象的值返回字符串"true"或"false"。如果调用该方法的对象不是Boolean,则抛出异常TypeError。
在Boolean对象被用于字符串环境中时,此方法会被自动调用。
下面脚本将创建一个Boolean对象,并把它转换成字符串:
<scripttype="text/javascript"> varboo=newBoolean(true); document.write(boo.toString()); </script>
脚本输出:true。
先看一例:
varaaa={
i:10,
valueOf:function(){returnthis.i+30;},
toString:function(){returnthis.valueOf()+10;}
}
alert(aaa>20);//true
alert(+aaa);//40
alert(aaa);//50
之所以有这样的结果,因为它们偷偷地调用valueOf或toString方法。但如何区分什么情况下是调用了哪个方法呢,我们可以通过另一个方法测试一下。由于用到console.log,请在装有firebug的FF中实验!
varbbb={
i:10,
toString:function(){
console.log('toString');
returnthis.i;
},
valueOf:function(){
console.log('valueOf');
returnthis.i;
}
}
alert(bbb);//10toString
alert(+bbb);//10valueOf
alert(''+bbb);//10valueOf
alert(String(bbb));//10toString
alert(Number(bbb));//10valueOf
alert(bbb=='10');//truevalueOf
alert(bbb==='10');//false
乍一看结果,大抵给人的感觉是,如果转换为字符串时调用toString方法,如果是转换为数值时则调用valueOf方法,但其中有两个很不和谐。一个是alert(''+bbb),字符串合拼应该是调用toString方法……另一个我们暂时可以理解为===操作符不进行隐式转换,因此不调用它们。为了追究真相,我们需要更严谨的实验。
varaa={
i:10,
toString:function(){
console.log('toString');
returnthis.i;
}
}
alert(aa);//10toString
alert(+aa);//10toString
alert(''+aa);//10toString
alert(String(aa));//10toString
alert(Number(aa));//10toString
alert(aa=='10');//truetoString
再看valueOf。
varbb={
i:10,
valueOf:function(){
console.log('valueOf');
returnthis.i;
}
}
alert(bb);//[objectObject]
alert(+bb);//10valueOf
alert(''+bb);//10valueOf
alert(String(bb));//[objectObject]
alert(Number(bb));//10valueOf
alert(bb=='10');//truevalueOf
发现有点不同吧?!它没有像上面toString那样统一规整。对于那个[objectObject],我估计是从Object那里继承过来的,我们再去掉它看看。
Object.prototype.toString=null;
varcc={
i:10,
valueOf:function(){
console.log('valueOf');
returnthis.i;
}
}
alert(cc);//10valueOf
alert(+cc);//10valueOf
alert(''+cc);//10valueOf
alert(String(cc));//10valueOf
alert(Number(cc));//10valueOf
alert(cc=='10');//truevalueOf
如果只重写了toString,对象转换时会无视valueOf的存在来进行转换。但是,如果只重写了valueOf方法,在要转换为字符串的时候会优先考虑valueOf方法。在不能调用toString的情况下,只能让valueOf上阵了。对于那个奇怪的字符串拼接问题,可能是出于操作符上,翻开ECMA262-5发现都有一个getValue操作。嗯,那么谜底应该是揭开了。重写会加大它们调用的优化高,而在有操作符的情况下,valueOf的优先级本来就比toString的高。
以上所述是小编给大家介绍的JavaScript中的valueOf与toString方法的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!