全面解析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方法的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!