4

プリミティブな JavaScript 値をラップしてオブジェクトにすることで発生するオーバーヘッドは、あるとすればどのようなものですか?

例えば:

> var x = Object(12);
undefined
> typeof x
"object"
> ({}).toString.call(x);
"[object Number]"

> var y = 12;
undefined
> typeof y
"number"
> ({}).toString.call(y);
"[object Number]"

質問の理由: JavaScript と Java コード (後で Javascript コードにコンパイルされる) の間で値を変換する GWT コードを使用しています。Java は型を重視し、GWT JSNI (相互運用メソッド) はプリミティブとオブジェクトをサポートするため、なぜ「ボックス化された」プリミティブを返さないのか疑問に思っていました (たとえば、Object(12) は 12 のボックス化バージョンです)。

答えは、私が期待していた明確な速度です。それがそれほど深刻になるとは思いませんでしたが、パフォーマンスに深刻な代償を払うことができるか、支払うことができる場合は、ボックス化された Javascript プリミティブを明らかに避けてください。(Janが言及しているように、メソッド呼び出しからのオーバーヘッドがこれを反転させるという警告があります)

4

2 に答える 2

3

プリミティブはオブジェクトではないため、安価です (Alex Wayne の回答を参照してください)。一方で

文字列リテラル値に対して String オブジェクトの任意のメソッドを呼び出すことができます。JavaScript は自動的に文字列リテラルを一時的な String オブジェクトに変換し、メソッドを呼び出して、一時的な String オブジェクトを破棄します。文字列リテラルで String.length プロパティを使用することもできます。

MDN マニュアルを参照してください

したがって、プリミティブを使用しますが、それらのメソッドを呼び出したい場合は、代わりにオブジェクトを作成する必要があります。

于 2013-05-22T20:17:18.817 に答える
3

var x = Object(12);よりも約 97% 遅いようです。var x = 12;

http://jsperf.com/object-wrap-number-overhead

ただし、番号でメソッドを呼び出す場合は、違いははるかに小さくなりますが、番号で呼び出さないObject()方が高速です。


しかし、本当の問題は、なぜこれを行うのかということです。この明示的な変換を行わなくても、数値のメソッドを呼び出すことができます。

var x = 12.1234;
x.toFixed(2); // "12.12"
于 2013-05-22T20:17:41.007 に答える