コンテンツにスキップ

JavaScript/Object/prototype/valueOf

出典: フリー教科書『ウィキブックス(Wikibooks)』

Object.prototype.valueOf()

[編集]
構文
obj.valueOf()

オブジェクトのプリミティブ値を返します。算術演算子や文字列連結に使用される場合、valueOf()が優先的に呼び出されます。

Object.prototype.valueOf() は、JavaScript におけるすべてのオブジェクトが継承するメソッドで、オブジェクトのプリミティブな値を返すために使用されます。

ただし、Object.prototype.valueOf() は、ほとんどの組み込みオブジェクトでオーバーライドされているか、カスタマイズされて使用されるため、その挙動はオブジェクトの種類によって異なります。

基本的な動作

[編集]

デフォルトでは、valueOf() はオブジェクト自身を返します(プリミティブな値ではなく、参照としてのオブジェクトを返します)。

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

この動作は、Object のデフォルト実装によるものです。

異なるオブジェクトでの動作

[編集]

数値 (Number) オブジェクト

[編集]

Number オブジェクトでは、valueOf() は数値のプリミティブ値を返します。

const num = new Number(42);
console.log(num.valueOf()); // 42

文字列 (String) オブジェクト

[編集]

String オブジェクトでは、valueOf() は文字列のプリミティブ値を返します。

const str = new String("Hello");
console.log(str.valueOf()); // "Hello"

配列 (Array)

[編集]

Array オブジェクトでは、valueOf() はオブジェクトそのものを返します。

const arr = [1, 2, 3];
console.log(arr.valueOf()); // [1, 2, 3]
console.log(arr.valueOf() === arr); // true

カスタムオブジェクト

[編集]

独自のオブジェクトで valueOf() をオーバーライドすることができます。

class Custom {
  constructor(value) {
    this.value = value;
  }
  valueOf() {
    return this.value;
  }
}

const customObj = new Custom(100);
console.log(customObj.valueOf()); // 100

valueOf() の主な用途

[編集]
  1. 演算子での型変換 JavaScript では、+ や比較演算子を使う際に、オブジェクトがプリミティブ値に変換される場合があります。そのとき valueOf() が呼び出されます。
    const num = new Number(10);
    console.log(num + 5); // 15 (num.valueOf() が呼ばれる)
    
  2. カスタム動作 カスタムオブジェクトで特定の動作を持たせるためにオーバーライドすることがあります(例:ゲームオブジェクトのスコア計算など)。

注意点

[編集]
  • Object.prototype.valueOf() は通常のオブジェクトでは滅多に直接使用されません。
  • プリミティブ値を返すのか、オブジェクトそのものを返すのかはオブジェクトの種類に依存します。
  • 独自のクラスやオブジェクトでオーバーライドする場合、慎重に設計する必要があります。

まとめ

[編集]

Object.prototype.valueOf() は、オブジェクトのプリミティブ値を取得するためのメソッドであり、デフォルトではオブジェクトそのものを返します。ただし、特定のビルトインオブジェクトやカスタムオブジェクトで挙動を変えることができます。