JavaScript的valueOf和toString | 影の域

影の域

关注web前端,追逐html5脚步,体会code人生

JavaScript的valueOf和toString

| 6,191 点击

JavaScript中valueOf函数方法是返回指定对象的原始值。

 对象 返回值
Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。
Boolean Boolean 值。
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function 函数本身。
Number 数字值。
Object 对象本身。这是默认情况。
String 字符串值。

JavaScript中toString函数方法是返回对象的字符串表示
对象 操作
Array 将 Array 的元素转换为字符串。结果字符串由逗号分隔,且连接起来。
Boolean 如果 Boolean 值是 true,则返回 “true”。否则,返回 “false”。
Date 返回日期的文字表示法。
Error 返回一个包含相关错误消息的字符串。
Function 返回如下格式的字符串,其中 functionname 是被调用 toString 方法函数的名称: function functionname( ) { [native code] }
Number 返回数字的文字表示。
String 返回 String 对象的值。
默认 返回 “[object objectname]”,其中 objectname 是对象类型的名称。

假设在古代,一两黄金换20两白银,一两白银换25枚铜钱,构建描述货币的类:

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);
var money2 = new Money(2, 4, 6);

var money3 = Money.parse(money1 + money2);
alert(money3);

这里隐式调用了valueOf跟toString,二者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中,优先调用了toString。比如
money1 + money2,调用的就是两者valueOf之后的值相加,而alert的时候,把money3先toString了一下。

这个例子其实是模仿js内置对象Date的,Date基本上也是这样处理问题的。

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);
var m2 = new Money(2);
m = m1 + m2
alert(m1);
alert(m2);
alert(m);