JS valueOf()方法:返回物件的值

2020-07-16 10:05:11
JavaScript valueOf() 是 Object 的原型方法,它定義在 Object.prototype 物件上,所有 Object 的範例物件都會繼承 valueOf() 方法。

valueOf() 方法能夠返回物件的值。JavaScript 自動型別轉換時會預設呼叫 valueOf() 原型方法。Object 物件預設 valueOf() 方法返回值與 toString() 方法返回值相同,但是部分型別物件重寫了 valueOf() 方法。

valueOf() 的語法格式如下:

object.valueOf()

返回值:返回該物件的原始值。

範例1

Date 物件的 valueOf() 原型方法返回值是當前日期物件的毫秒數。
var o = new Date();  //物件範例
console.log(o.toString());  //返回當前時間的UTC字串
console.log(o.valueOf());  //返回距離1970年1月1日午夜之間的毫秒數
console.log(Object.prototype.valueOf.apply(o));  //預設返回當前時間的UTC字串
當 String、Number 和 Boolean 物件具有明顯的原始值時,它們的 valueOf() 原型方法會返回合適的原始值。

範例2

在自定義型別時,除了重寫 toString() 方法外,也可以重寫 valueOf() 原型方法。這樣當讀取自定義物件的值時,就能避免返回的值總是 "[object Object]"。
function Point (x, y) {  //自定義資料型別
    this.x = x;
    this.y = y;
}
Point.prototype.valueOf = function () {  //自定義Point資料型別的valueOf()原型方法
    return "(" + this.x + "," + this.y + ")";
}
var p = new Point(26, 68);
console.log(p.valueOf());  //返回當前物件的值"(26,68)"
console.log(Object.prototype.valueOf.apply(p));  //預設返回值為"[object Object]"
在特定環境下進行資料型別轉換時(如把物件轉換為字串),valueOf() 原型方法的優先順序要比 toString() 方法的優先順序高。因此,如果一個物件的 valueOf() 原型方法返回值和 toString() 方法返回值不同,且希望轉換的字串為 toString() 方法的返回值時,就必須明確呼叫物件的 toString() 方法。

範例3

在下面範例中,當獲取自定義型別的物件 p 時,console.log() 方法會首先呼叫 valueOf() 原型方法,而不是 toString() 方法,如果需要獲取該物件的字串表示,則必須明確呼叫物件的 toString() 方法。
function Point (x, y) {  //自定義資料型別
    this.x = x;
    this.y = y;
}
Point.prototype.valueOf = function () {  //自定義Point資料型別的valueOf()方法
    return "(" + this.x + "," + this.y + ")";
}
Point.prototype.toString = function () {  //自定義Point資料型別的toString()方法
    return "[object Point]";
}
var p = new Point(26,68);  //範例化物件
console.log("typeof p = " + p);  //預設呼叫valueOf()方法進行型別轉換
console.log("typeof p = " + p.toString());  //直接呼叫toString()方法進行型別轉換