0

JavaScript でオブジェクトから文字列への変換をいじっていました。すべてのオブジェクトは、 と の 2 つの変換関数を継承toString()valueOf()ます。JavaScript がオブジェクトを文字列に変換しようとすると、実装が検索toString()され、次に実装が検索valueOf()されます。だから私はこの方法でtoString()andを上書きしましたvalueOf()

var obj = {
x: 10,
y: 20,   
toString: function() {
    return "x = " + this.x + ", y = " + this.y;
},
valueOf: function() {
    return this.x + ", " + this.y;
}};

オブジェクト リテラルと文字列を連結します。

console.log("hello " + obj);

出力:hello 10, 20

出力は次のようにすべきではありません: hello x = 10, y = 20?

どんな助けにも感謝します。

4

2 に答える 2

2

console.log("hello " + obj);、 の型変換を行う演算子obj+、加算演算子と呼ばれます。

加算演算子では、文字列にキャストされる代わりに、各引数が型ヒントなしでプリミティブ値にキャストされます。型ヒントなしでオブジェクトがプリミティブにキャストされると、メソッドvalueOfが使用可能であればそれが使用されます。valueOf呼び出し可能でない場合、または非プリミティブ値を返す場合にのみtoString使用されます。と の両方が非プリミティブ値valueOfを返す場合、 aがスローされます。toStringTypeError


仕様の引用:

http://es5.github.com/#x11.6.1

11.6.1 加算演算子 ( + )

1) lref を AdditiveExpression の評価結果とする。
2) lval を GetValue(lref) とする。
3) rref を MultiplicativeExpression の評価結果とする。4) rval を GetValue(rref) とする。5) lprim を ToPrimitive(lval) とする。
6) rprim を ToPrimitive(rval) とする。
7) Type(lprim) が String または Type(rprim) が String の場合、
...

注 1手順 5 と 6 の ToPrimitive の呼び出しでは、ヒントは提供されません。

http://es5.github.com/#x9.1

9.1 プリミティブへ

...

Object - オブジェクトのデフォルト値を返します。オブジェクトのデフォルト値は、オブジェクトの [[DefaultValue]] 内部メソッドを呼び出し、オプションのヒント PreferredType を渡すことによって取得されます。[[DefaultValue]] 内部メソッドの動作は、8.12.8 のすべてのネイティブ ECMAScript オブジェクトについて、この仕様によって定義されています。

http://es5.github.com/#x8.12.8

8.12.8 [[DefaultValue]] (ヒント)

O の [[DefaultValue]] 内部メソッドがヒントなしで呼び出されると、O が Date オブジェクト (15.9.6 を参照) でない限り、ヒントが Number であるかのように動作します。弦。

...

O の [[DefaultValue]] 内部メソッドがヒント Number で呼び出されると、次の手順が実行されます。

1) valueOf を、オブジェクト O の [[Get]] 内部メソッドを引数「valueOf」で呼び出した結果とする。
2) IsCallable(valueOf) が true の場合、

  • val を valueOf の [[Call]] 内部メソッドを呼び出した結果とし、O を this 値とし、引数リストを空にします。
  • val がプリミティブ値の場合、val を返します。
    ...
于 2013-02-23T09:38:13.977 に答える
0

オブジェクトで文字列を追加している場合、toStringではなくvalueOfが呼び出される理由であるプリミティブ値に変換しようとします

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/valueOf

于 2013-02-23T09:22:32.193 に答える