首页 > JS&HTML > javascript valueOf() and toString()

javascript valueOf() and toString()

一直不是很清楚valueOf()与toString()的区别,平时也不太注意这些细节。http://bbs.51js.com/viewthread.php?tid=79935上面的总结感觉很是不错:

二者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中,优先调用了toString。

《javaScript 高级程序设计》一书中的描述如下:

toString()——返回对象的原始字符串表示

valueOf()——返回最适合该对象的原始值

前面两个示例均引用自http://bbs.51js.com/viewthread.php?tid=79935

<script type="text/javascript">
function Money(gold, silver, coin)
{
this.gold = gold;
this.silver = silver;
this.coin = coin;
}

Money.parse = function(value)
{
var coin = parseInt(value % 25);
var silver = parseInt(value / 25 % 20);
var gold = parseInt(value / 500);
return new Money(gold, silver, coin);
}

Money.prototype.valueOf = function()
{
return ((this.gold * 20) + this.silver) * 25 + this.coin;
}

Money.prototype.toString = function()
{
return this.gold + "两黄金," + this.silver + "两白银," + this.coin + "文钱";
}

var money1 = new Money(5, 6, 1);  //valueOf  (5*20+6)*25+1=2651
var money2 = new Money(2, 4, 6);  //valueOf  (2*20+4)*25+6=1106
var money3 = Money.parse(money1 + money2);// parse(3757) new Money(7,10,7)
alert(money3);
</script>
<script type="text/javascript">
function Money(n)
{
this.n = n;
}
Money.prototype.valueOf = function()
{
return this.n * 2
}
Money.prototype.toString = function()
{
return this.n * 3
}
var m1 = new Money(1); //对象默认返回的是toString()方法
var m2 = new Money(2); //对象默认返回的是toString()方法
m = m1 + m2; //涉及到数学运算,调用其valueOf()方法,所以返回2+4  6
alert(m1);
alert(m2);
alert(m);
</script>

Zakas 在其blog中出的js测试题中也有检测二者区别的题My JavaScript quiz

<script type="text/javascript">
var o = {
        x: 8,

        valueOf: function(){
         alert('xxx');
            return this.x + 2;
        },
        toString: function(){
         alert('yyy');
            return this.x.toString();
        }
    },
    result = o < "9"; //数学比较运算,调用valueOf()方法,返回的是 10 < "9" 字符串被转化为数字,为 10 < 9 所以是false
alert(o); //对象默认返回的是toString()方法,所以其值是8,准确的说是字符串"8"

alert(typeof(o.toString())); //返回string
</script>
  1. Jutoy 二 22nd, 2010 @ 14:06 | #1

    小小子新年 好哦~沙发拜年~

  2. simaopig 二 22nd, 2010 @ 14:08 | #2

    @Jutoy
    呵呵,一样,新年快乐。

    刚才还在想,为啥你的推友见面的文章里只有你的背景。记得小伙长的蛮帅的啊。呵。

  3. Jutoy 二 22nd, 2010 @ 14:11 | #3

    @simaopig
    呵呵,我拿着相机总不能照自己吧哈哈

  4. simaopig 二 22nd, 2010 @ 14:12 | #4

    @Jutoy
    呵呵。快回学校了吧?有假期真好啊。

  5. Jutoy 二 22nd, 2010 @ 14:14 | #5

    @simaopig
    嗯,马上要开学了,哎,也没剩下几个寒暑假期了~

  6. simaopig 二 22nd, 2010 @ 14:17 | #6

    @Jutoy
    呵呵。看看你大学的生活,感觉真是挺丰富精彩的。

    现在的我,只有后悔的份。呵。

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks