浅谈valueOf和toString的区别

<p style="text-align: left; margin: 30px 0 15px;"><strong>首先我们了解一下它们的作用</strong></p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">valueOf():取得此对象的原始值</p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">toString():返回对象的字符串表示</p>
<p style="text-align: left; margin: 30px 0 15px;"><strong>道底什么时候调用<strong>valueOf()</strong>,什么时候调用<strong>toString()</strong>呢?</strong></p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">这里我总结了一下前辈们的成果,同时自己也查寻一些文档归纳了一下(先不考虑Date类型,因为这个比较特殊)。</p>
<p style="text-align: left; text-indent: 2em; line-height: 1.5em;">1、任何与<strong style="color: blue;">运算符</strong>相关的操作都会调用valueOf(), &nbsp;这里的<strong style="color: blue;">运算符</strong>包括(+,-,*,/,%,^,==)等运算符(Date类型除外)</p>
<p style="text-align: left; text-indent: 2em; line-height: 1.5em;">2、在没有<strong style="color: blue;">运算符</strong>的情况下对对象进行操作时,默认会调用toString()</p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">3、对于包装类</p>
<p style="text-align: left; text-indent: 5em; line-height: 2em;">Number()默认调用valueOf()</p>
<p style="text-align: left; text-indent: 5em; line-height: 2em;">String()默认调用toString()</p>
<p style="text-align: left; text-indent: 5em; line-height: 2em;">Boolean()两个方法都不调用</p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">4、在一条语句中,valueOf()和toString()只会调一次</p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">5、“===”运算符两个方法都不会调用</p>
<p style="text-align: left; text-indent: 2em; line-height: 2em;">6、Date类型默认调用的是toString()方法(包括有<strong style="color: blue;">运算符</strong>的 下)</p>
<p style="text-align: left; line-height: 2em; margin: 30px 0 15px;"><strong>下面来验证一下以上观点</strong></p>
<p style="text-align: left; line-height: 2em;">1、任何与<strong style="color: blue;">运算符</strong>相关的操作都会调用valueOf()</p>
<pre name="code" class="javascript">var obj = {
i : 's',
valueOf : function(){
console.log('valueOf');
return this.i;
},
toString : function(){
console.log('toString');
return this.i;

}
}
console.log(obj++); //valueOf
console.log(obj--); //valueOf
console.log(obj*1); //valueOf
console.log(obj/2); //valueOf
console.log(obj%2); //valueOf
console.log(obj^2); //valueOf
console.log(obj == 10); //valueOf
console.log('a'+obj); //valueOf</pre>
<p style="text-align: left; line-height: 2em;">2、在没有<strong>运算符</strong>的情况下对对象进行操作时,默认会调用toString()</p>
<pre name="code" class="javascript" style="text-indent: 2em;">var obj = {
i : 1,
valueOf : function(){
console.log('valueOf');
return this.i;
},
toString : function(){
console.log('toString');
return this.i;

}
}
console.log(obj); //toString</pre>
<p style="text-align: left; line-height: 2em;">3、对观点3进行验证</p>
<pre name="code" class="javascript" style="text-indent: 2em;">var obj = {
i : 1,
valueOf : function(){
console.log('valueOf');
return this.i;
},
toString : function(){
console.log('toString');
return this.i;

}
}
console.log(Number(obj)); //valueOf
console.log(String(obj)); //toString
console.log(Boolean(obj)); //
</pre>
<p style="text-align: left; line-height: 2em;">4、在一条语句中,valueOf()和toString()只会调一次</p>
<pre name="code" class="javascript" style="text-indent: 2em;">var obj = {
i : 1,
valueOf : function(){
console.log('valueOf');
return this.i;
},
toString : function(){
console.log('toString');
return this.i;

}
}
console.log(String(obj)); //toString
console.log(String(obj++)); //valueOf 这是是先执行++,因为++操作调用了valueOf(),之后进行String()运算是就不会再调用toString()和valueOf()了
</pre>
<p style="text-align: left; line-height: 2em;">5、“===”运算符两个方法都不会调用</p>
<pre name="code" class="javascript" style="text-indent: 2em;">var obj = {
i : 1,
valueOf : function(){
console.log('valueOf');
return this.i;
},
toString : function(){
console.log('toString');
return this.i;

}
}
console.log(obj === 's'); // 两信方法都没有调用
</pre>
<p style="text-align: left; line-height: 2em;">6、Date类型默认调用的是toString()方法(包括有运算符的 下)</p>
<pre name="code" class="javascript" style="text-indent: 2em;">var date = new Date();
console.log(date.valueOf()); //1381411159735
console.log(date.toString()); //Thu Oct 10 2013 21:19:19 GMT+0800 (中国标准时间)
console.log(date + 1); //Thu Oct 10 2013 21:19:19 GMT+0800 (中国标准时间)
console.log(date + 1); Thu Oct 10 2013 21:19:19 GMT+0800 (中国标准时间)1
</pre>
<p style="text-align: left; line-height: 2em;text-indent:2em">由上面结果可以证明前面的观点</p>

posted on 2013-11-05 09:31  红茶一点  阅读(333)  评论(0)    收藏  举报

导航