You Don't Know JS: types & grammar, chapter 4:
オブジェクト(及びアレイ)は最初、そのプリミティブ値と等価に変換され、得られた値は、(既に数プリミティブではない場合)はToNumberに従って番号に強制されます今述べたルール。
ToPrimitive抽象オペレーション(ES5仕様、セクション9.1)は、問題の値(内部DefaultValueオペレーション-ES5仕様、セクション8.12.8を使用)を参照して、 valueOf()メソッドvalueOf()が利用可能でプリミティブ値を返す場合、その値は強制的に使用されます。そうでない場合、toString()は強制的な値を提供します(存在する場合)。
いずれの操作もプリミティブ値を提供できない場合は、TypeErrorがスローされます。
だから、私はあなたのオブジェクトは、あなたのオブジェクト上で実行されている両方の算術演算では、その方法は、数にオブジェクトを強制するために呼び出されるので、番号を返しvalueOf
方法を持っていることを前提としています、結果として得られる値は操作で実際に使用される値です。
また、あなたの例では、それはその基礎となる
valueOf
方法、我々は
id + 10
ような何かをしようとすると、私たちは
[object Object]10
を取得し、理由があるが含まれていないので、かなり役に立たないのですか?デフォルトの
valueOf
がプリミティブを提供できないため、を返す
toString
が参照され、そのプリミティブ値は
10
と連結され、
[object Object]10
になります。より良いこれらの例を見てみましょう、これを理解するには
:
1.
const id = {
_high: 0,
_low: 256,
remainder: { _low: 0, high: 0, remainder: null },
valueOf: function(){
return 20; /* valueOf does not fail to provide a primitive, "20" will
be used". */
},
toString: function() {
return 10; /* toString's return value would be used (if it was a primitive), if "valueOf" failed to provide a primitive. */
}
};
console.log(id + 10); // prints out "30"
2.
const id = {
_high: 0,
_low: 256,
remainder: { _low: 0, high: 0, remainder: null },
valueOf: function(){
return {}; // valueOf fails to provide a primitive
},
toString: function() {
return 10; // toString provides a primitive value, so "10" will be used.
}
};
console.log(id + 10); // prints out "20"
3.
const id = {
_high: 0,
_low: 256,
remainder: { _low: 0, high: 0, remainder: null },
valueOf: function(){
return {}; /* valueOf fails to provide a primitive */
},
toString: function() {
return {}; /* toString fails to provide a primitive as well */
}
};
console.log(id + 10); // a "TypeError" is thrown :(
のコメントを参照してください@NinaScholz。上の例のようなオブジェクトを返します。 – kentor
@ NinaScholzそれはちょうど私の質問ですが、私はそれも得られませんが、それは動作します。自分でテストすることができます。 1つの数字(たとえば、_lowが0より大きい場合)がtrueの場合、falseを返すことに気付きました。 – kentor
JavaScriptはオブジェクトを'.valueOf()'メソッドを呼び出して数値を返します。それは言語仕様の複雑な詳細で説明されています。 – Pointy