一直不是很清楚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>
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>
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>
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>
小小子新年 好哦~沙发拜年~