0
Object.prototype.valueOf.call("abc")
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}
Object.prototype.valueOf.call(new String("abc"))
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}

MDN によると、JavaScript はオブジェクトをプリミティブ値に変換するために valueOf メソッドを呼び出します。オブジェクトにプリミティブ値がない場合、valueOf はオブジェクト自体を返し、次のように表示され ます 。プリミティブ { '0': 'a' , '1': 'b' , '2': 'c' }を返します。定義に反していませんか?なぜその形式で返すのですか?今、これは混乱を引き起こしました.Object.prototype.valueOf.call(array)が配列などに対して呼び出された場合に何が返されるかを知る方法オブジェクト。

また、ログに記録されたときにメソッド{}.valueOf()からの戻り値が 何も表示されないため、戻りオブジェクトフォームが表示される理由[].valueOf()

4

2 に答える 2

6

valueOf(リンクです)が何をするか見てみましょう:

この値を引数として渡して ToObject を呼び出した結果を O とします。

オブジェクトへ:

[[PrimitiveValue]] 内部プロパティが引数の値に設定された新しい String オブジェクトを作成します。String オブジェクトの説明については、15.5 を参照してください。

つまり、元の値を持つ新しい文字列オブジェクトを作成するだけnew String('abc')です。これがコンソールにどのように表示されるかを見てみましょう.valueOf.call。結果と同じであることがわかります。

編集:これは、実際には、回答を表示するために使用する媒体と関係があります。Chrome と Firefox の開発ツールは、文字列をリテラル値 (文字列自体) として表示しますが、文字列オブジェクトを通常のオブジェクトのように (プロパティを表示することによって) 表示します。

文字列は、いくつかのメソッドを持つ文字の単なる「配列」です。したがって、この表現{'0' : 'a', '1' : 'b', '2' : 'c'}は、「a最初の位置、b2 番目、c3 番目の位置」を意味します。これは、要求した文字列です。

そして、最後の注意として、valueOf与えません[object ObjectName]。あなたは言及しているかもしれませんObject.prototype.toString

于 2013-05-15T08:32:03.113 に答える
3

おそらく、実際の質問が何であるかを見逃しています。ECMA-262 の内容は次のとおりです。

15.2.4.4 Object.prototype.valueOf ( )

valueOfメソッドが呼び出されると、次の手順が実行されます。

  1. この値を引数として渡して ToObject を呼び出した結果を O とします

  2. Oがホスト オブジェクト ( 15.2.2.1 ) でObject コンストラクターを呼び出した結果である場合、

    を。Oまたはコンストラクターに最初に渡されたホスト オブジェクトなどの別の値を返します。返される特定の結果は実装定義です。

  3. Oを返します。

式では:

Object.prototype.valueOf.call("abc")

Object.prototype.valueOfは、文字列プリミティブをthisとして呼び出しています。したがって、ステップ 1 で、内部のToObjectメソッドを使用して変換されます。

Type String (「abc」) の値が渡された場合、ToObjectは String オブジェクトを返します。

オブジェクトはホスト オブジェクトではない (ネイティブ オブジェクト) ため、ステップ 2 は関係ありません。

ステップ 3 は、toObjectによって作成されたオブジェクトを返します。

それでそれをテストしてください:

var x = Object.prototype.valueOf.call("abc");

alert(typeof x); // object

結果の値が String オブジェクトであるため、 typeofはobjectを返します(typeof 演算子の優れた特徴です)。さらに進むことができます:

typeof x.match; // function
x.constructor;  // function String() {[native code]}
alert(x); // abc

String オブジェクト (への参照) である戻り値とすべて一致します。

于 2013-05-15T09:11:20.587 に答える