場合はJavaScriptでオブジェクトが構築されますか?
-
13-09-2019 - |
質問
次のJavaScript関数を考える(1):
function setData(domElement) {
domElement.myDataProperty = {
'suppose': 'this',
'object': 'is',
'static': 'and',
'pretty': 'big'
};
};
は、今、私はこの機能については好きではないものを正確に同じオブジェクトは関数が呼び出されるたびに作成されていることです。オブジェクトは変更されませんので、私はむしろ一度だけ、それを作成します。だから我々は、以下の調整を行うことができた(2):
var dataObject = {
'suppose': 'this',
'object': 'is',
'static': 'and',
'pretty': 'big'
};
function setData(domElement) {
domElement.myDataProperty = dataObject;
};
スクリプトがロードされ、dataObject
に格納されている場合は、これでオブジェクトが一度作成されます。スクリプト機能をロードされた回数のほとんどが使用されていない - しかし、のは、そのsetData
はたまにしか呼ばれていると仮定しましょう。私はその場合に、この機能については好きではないことは、オブジェクトが常に作成され、それが使用されることはありませんここで多くの場面を含め、メモリに保持されていることです。私はあなたが理想的なバランスを取るために、このような何かを行うことができます考え出し(3):
var dataObject;
function setData(domElement) {
if (!dataObject) {
dataObject = {
'suppose': 'this',
'object': 'is',
'static': 'and',
'pretty': 'big'
};
}
domElement.myDataProperty = dataObject;
};
意味をなさないでしょうか?私はそれがインタプリタはオブジェクトを作成することを決定したときに依存把握します。それは!dataObject
条件を渡し、またはそれは関数を入力ず、スマートにしようとすると、事前にそれを構築することを決定するまで、それが本当に待っていますか?おそらく異なるのJavascriptエンジンがこれに関して異なるポリシーを持っている?
そして、もちろん、これらの最適化は、これまで実際には問題になるかどうかの質問があります。これは明らかになど、オブジェクトの大きさ、エンジンの回転数、利用可能なリソースの量、などの要因に依存します..しかし、一般的に、あなたが言うことになるもう一つの重要な最適化がある:(1)から(2)又は(2)から(3)
に解決
答えは、あなたが知っていることになっていないしている、です。あなたが示した例は、それらの間にはほとんど違いがあります。あなたは一つの方法または別のnoticably特定のインタプリタ上のパフォーマンスやメモリ使用量を傷つけるされたことを実際の証拠を持っている場合あなたが合理的にこのことを心配したい唯一の方法です。それまでは、それはあなたのためにその原料を心配する通訳者の仕事です。
それはあなたが本当に知りたい場合は...それを試してみて、見つける、と述べました。異なるバージョンに100万回を呼び出し、それが作るものの違い参照してください。
オブジェクトの巨大バージョンを作成し、それがへこみを作るかどうかを確認します。タスクマネージャをご覧ください。別のブラウザを試してみてください。あなたの結果を折り返し報告。それはちょうど彼らがケースかもしれないと思うものをインターネット上でジャークの束を問うよりも、見つけるためのより良い方法です。
ただ...に関係なく、とにかくメモリでなければならないオブジェクトを念頭に置いておくとして、のソーステキストの
他のヒント
新しいオブジェクトが作成されなければならない - それはスペックがそれを必要とする部分的にので、することができるが、代替として振る舞いはカウンター直感的になる主な理由は、服用しないことはできません。
function f() {
return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"
あなたは本当に、実際にあなたが求めているオブジェクトを生成しないように新しいオブジェクト式を期待していますか?それはあなたが望むように見えるものだからです。
おそらくあなただけやりたいます:
var myFunction = (function(){
var object = {a: "b", c: "d"};
return function() { return object; }
})();
どのあなたが戻っているオブジェクトを変更することができ、完全に変更可能なオブジェクトであり、誰もが同じ変異インスタンスを共有することになることを認識する必要があるでしょうが、あなたが望む効果を得るでしょう。
まず、私は状況#2でそれを実装したいと一度すぐにページがロードされた後、それをロードします。
ページスピードに問題があった場合、私は、ページ内の特定のタスクにかかる時間を測定します。
それは(相対的に言って)オブジェクトを作成することは非常に高価だった場合、私は状況#3に移動します。
それは本当に...あなたに何かを購入し、この場合には、簡単な/大きなオブジェクトを作成すると、あなたのCPUのバックオフ汗ではありませんしない場合は、「もし」ステートメントを追加するポイントはありません。あなただけのブラインドを撮影している。
- 測定がなければ、最適化していません。これは実際に私が個人的にC ++とJavaで使用されてきたものを初期化するかなり一般的な方法です。
まず、この最適化は実際には重要ではありません。
第二に、最後の関数は、最初の関数とまったくとして良いです。よくほとんど。最初に私はあなたがdomElement.myDataProperty
を再割り当てするときに、古いオブジェクトを破棄すべきであるガベージコレクタのなすがままにしていると仮定します。それでも、ガベージコレクタがターゲットプラットフォーム上で動作します(と、それはブラウザ間で非常に異なる場合があります)正確にどのように知らなくても、あなたはあなたがすべてで本当にすべての作業を保存していることを確認することはできません。
ブラウザのカップルで、それらのすべての3つを試してみて、より高速であるかを調べる。