JavaScriptにおけるvalueOfとtoStringメソッド

valueOf

JavaScriptは、valueOfメソッドを呼び出してオブジェクトを原始値に変換します。通常、開発者はこのメソッドを直接呼び出すことはほとんどありませんが、予期される原始値が必要な場合、JavaScriptは自動的にこのメソッドを呼び出します。各組み込みオブジェクトは、適切な値を返すためにこのメソッドをオーバーライドしています。

オブジェクト 戻り値
Array 配列オブジェクト自体
Boolean ブール値
Date 1970年1月1日午前0時からのミリ秒数(UTC)
Function 関数自体
Number 数値
Object デフォルトではオブジェクト自体
String 文字列値
const arr = [];
console.log(arr.valueOf() === arr); // true

const date = new Date();
console.log(date.valueOf()); // 1376838719230

const num = 1;
console.log(num.valueOf()); // 1

const bool = true;
console.log(bool.valueOf() === bool); // true

const newBool = new Boolean(true);
console.log(newBool.valueOf() === newBool); // false

function funct() {}
console.log(funct.valueOf() === funct); // true

const obj = {};
console.log(obj.valueOf() === obj); // true

const str = "";
console.log(str.valueOf() === str); // true

const newStr = new String("");
console.log(newStr.valueOf() === newStr); // false

valueOfメソッドは、JavaScriptの実行中に頻繁に暗黙的に呼び出されます。以下は、カスタムクラスでvalueOfメソッドをオーバーライドする例です。

class ValueOfTest {
    constructor(val) {
        this.val = val;
    }
    valueOf() {
        return this.val;
    }
}

const v = new ValueOfTest(10);
console.log(v + 1); // 11

toString

JavaScriptは、toStringメソッドを呼び出してオブジェクトを文字列表現に変換します。各オブジェクトにはtoStringメソッドがあり、オブジェクトが文字列として表示されるときに自動的に呼び出されます。デフォルトでは、toStringメソッドはすべてのオブジェクトから継承され、カスタムオブジェクトでオーバーライドされていない場合、[object type]という形式の文字列を返します。

オブジェクト 戻り値
Array カンマ区切りの文字列(例: [1,2] -> 1,2
Boolean ブール値の文字列表現
Date 読みやすい時間文字列(例: Tue Oct 27 2020 16:08:48 GMT+0800 (中国標準時)
Function 関数のJavaScriptソースコード文字列
Number 数値の文字列表現
Object [object Object]文字列
String 文字列
const arr = [1, 2, 3];
console.log(arr.toString()); // 1,2,3

const date = new Date();
console.log(date.toString()); // Tue Oct 27 2020 16:12:35 GMT+0800 (中国標準時)

const num = 1;
console.log(num.toString()); // 1

const bool = true;
console.log(bool.toString()); // true

function funct() { var a = 1; }
console.log(funct.toString()); // function funct() { var a = 1; }

const obj = {a: 1};
console.log(obj.toString()); // [object Object]

const str = "1";
console.log(str.toString()); // 1

比較

JavaScriptは異なる状況でtoStringまたはvalueOfメソッドを呼び出します。toStringメソッドが優先されますが、演算子が使用される場合はvalueOfメソッドが優先されます。もしvalueOfメソッドで演算が不可能な場合、toStringメソッドが呼び出されます。

const v = {
    val: 10,
    valueOf: function() {
        console.log("valueOf");
        return this.val;
    },
    toString: function() {
        console.log("toString");
        return this.val;
    }
};

const obj = {"10": 1};

console.log(v); // {val: 10, valueOf: ƒ, toString: ƒ}
console.log(1 + v); // valueOf // 11
console.log(obj[v]); // toString // 1
console.log("" + v); // valueOf // 10
console.log(String(v)); // toString // 10
console.log(Number(v)); // valueOf // 10
console.log(v == 10); // valueOf // true

タグ: javascript valueOf toString オブジェクト変換 メソッドオーバーライド

9月16日 18:23 投稿