2

次の JavaScript の例を試しています。

function A() {};

A.prototype.x = new Number(10);

var a = new A();

console.log(a.x);

Firefox では、その印刷値は 10 ですが、Chrome または Node.js では {} として印刷されます。

しかし、以下のように 2 行目を変更すると、クロムでも 10 が出力されます

A.prototype.x = 10;

new Number(10) がクロムで機能しない理由を誰かが説明してくれますか。

4

3 に答える 3

2

new Number(...)ボックス化された Number インスタンスを作成しますが、これは数値プリミティブとは異なります。
Chrome のコンソールはそれをオブジェクトとして表示します。

と書くconsole.log(new Number(10))と、同じ出力が表示されます。

プリミティブ ( A.prototype.x = 10) を使用するようにコードを変更すると、 が表示され10ます。

于 2013-03-17T01:13:45.523 に答える
2

これは、プリミティブではなく Number ラッパー オブジェクトを作成しているためであり、それが Chrome で選択された表現です。(コンソールの表現は常に同じとは限りません。標準はありません。)

実際の数値10は という内部プロパティに格納される[[PrimitiveValue]]ため、直接公開されることはありません。

その を取得する[[PrimitiveValue]]には、メソッドを使用できます.valueOf()

console.log(a.x.valueOf()); // 10

15.7.2.1 新しい数値 ([値])

新しく構築されたオブジェクトの内部プロパティは、 (15.7.3.1)[[Prototype]]の初期値である元の Number プロトタイプ オブジェクトに設定されます。Number.prototype

新しく構築されたオブジェクトの[[Class]]内部プロパティは に設定され"Number"ます。

新しく構築されたオブジェクトの[[PrimitiveValue]]内部プロパティは、ToNumber(value)値が指定された場合は に設定され、そうでない場合は に設定されます+0

新しく構築されたオブジェクトの[[Extensible]]内部プロパティは に設定されtrueます。

于 2013-03-17T01:14:08.667 に答える
0

Number はオブジェクトだからです。console.log(a.x.valueOf());またはconsole.log(a.x.toString());動作します。

于 2013-03-17T01:13:47.357 に答える