JavaScript

Object.prototype.valueOf()メソッド

 編集:2022.08.20 by T.A.

オブジェクトのプリミティブな値を返します。

obj.valueOf()
obj 取得したいオブジェクト
戻り値

指定されたオブジェクトのプリミティブ値を返します。

(単項)プラス符号を valueOf の省略形として使用することができる場合があります。例えば、+new Number() などです。単項プラスの使用も参照してください。

解説

avaScript は valueOf メソッドを、オブジェクトをプリミティブな値に変換するときに呼び出します。あなたが自分で valueOf メソッドを実行する必要はほとんどなく、プリミティブな値が期待される場面にオブジェクトが出くわしたとき JavaScript が自動的に実行します。

既定で、valueOf メソッドは Object の子孫にあたるあらゆるオブジェクトに継承されています。全ての組み込みコア オブジェクトは適切な値を返すためにこのメソッドを上書きしています。もしオブジェクトがプリミティブな値を持たない場合、valueOf はオブジェクト自身を返します。

あなたのコードで組み込みオブジェクトをプリミティブな値にするために valueOf を呼ぶことができます。また、カスタム オブジェクトを作成した時に Object.prototype.valueOf() を上書きしてデフォルトの Object のメソッドの代わりにカスタム・メソッドを呼び出すようにすることができます。

カスタム オブジェクトでの valueOf の上書き

既定の valueOf メソッドに代わって呼び出される関数を作ることができます。その関数は引数を取ってはなりません。

MyNumberType というオブジェクト型があって、それに valueOf メソッドを作りたいとしましょう。以下のコードはユーザー定義関数をオブジェクトの valueOf メソッドに代入しています。

MyNumberType.prototype.valueOf = function() { return customPrimitiveValue; };

上のコードにより、MyNumberType 型のオブジェクトがプリミティブな値で表されるべき文脈では常に、JavaScript は自動的に上のコードで定義された関数を呼び出します。

オブジェクトの valueOf メソッドはたいてい JavaScript によって実行されますが、あなた自身も以下のように実行できます。

myNumberType.valueOf()

注: 文字列型の文脈にあるオブジェクトは toString() メソッドを通じて変換されますが、これは String オブジェクトが valueOf を使って文字列型に変換されるのとは違います。すべてのオブジェクトは、"[object type]" としか出力されないかもしれませんが、文字列変換できます。しかし多くのオブジェクトは数値や真偽値や関数には変換できません。

カスタム型での valueOf の使用
function MyNumberType(n) {
    this.number = n;
}
MyNumberType.prototype.valueOf = function() {
    return this.number;
};

var myObj = new MyNumberType(4);
D=myObj + 3;	//=7
単項プラスの使用
D= +"5";	//=5。文字列から数値へ
D= +"";	//=0。文字列から数値へ
D= +"1 + 2";	//=NaN。評価不能
D= +new Date();	// (new Date()).getTime() と同じ
D= +"foo";	//=NaN。文字列から数値へ
D= +{};	//=NaN
D= +[];	//=0。toString() は空の文字列リストを返す
D= +[1];	//=1
D= +[1,2];	//=NaN
D= +new Set([1]);	//=NaN
D= +BigInt(1);	// Uncaught(捕まえられない)。TypeError: Cannot convert a BigInt value to a number
D= +undefined;	//=NaN
D= +null;	//=0
D= +true;	//=1
D= +false;	//=0

¶意味不明


テスト