16

キー bar と値 xyz を持つ連想配列 Foo があるとします。

 console.log(Foo['bar']);

 >> xyz

 delete Foo['bar'];
 console.log Foo['bar'];

 >> undefined

 Foo['bar'] = 'xyz';
 console.log(Foo['bar']);

 >> xyz

 Foo['bar'] = undefined;
 console.log (Foo['bar']);

 >> undefined

私の質問は、2 つのうちどちらがより効率的かということです。どちらか一方を使用する必要があるシナリオはありますか?

ありがとう!

結果:

助けてくれて、jsperf を見せてくれてありがとう。undefined に設定すると、delete よりも (比較的) 大幅に高速になるように見えますが、以下に指摘されているすべての注意事項も非常に興味深いものです (実際、レフトフィールドからの将来のエラーを回避するために、おそらく今後多くの delete を使用することになるでしょう)。

4

7 に答える 7

7

私はこれらの操作のパフォーマンスをベンチマークしませんでした (コメントで述べたように、http://www.jsperf.comで小さなベンチマークを作成するだけです) が、違いについては言葉を失います。

deleteプロパティを設定するundefinednull、人やコードをハングさせますが、オペレーターに確認してくださいIN

お気に入り

if( 'bar' in Foo ) { }

に設定したtrue場合でも返されます。一緒に行けばそうはなりません。Foo.barundefineddelete Foo.bar

于 2012-12-20T23:53:28.150 に答える
7

オブジェクトからプロパティを削除すると、そのプロパティがプロトタイプ チェーンに存在する場合、同じ名前のプロパティに置き換えられることに注意してください。

プロパティを null または未定義に設定すると、単純にマスクされます。

于 2012-12-20T23:57:53.213 に答える
5

bへの後者の割り当て後もプロパティと見なされるため、長期的にはパフォーマンスにマイナスの差が生じますundefined。例えば:

var a = { b : 0 };

a.b = undefined;

a.hasOwnProperty("b");
>>> true

同じことがinキーワード ( "b" in ais true) にも当てはまるため、これは大きなオブジェクトの一部である場合に反復を妨げる可能性が最も高くなります。

于 2012-12-20T23:54:59.803 に答える
5

への削除または割り当ての実際のアクションのベンチマークとは別にundefined、オブジェクトを変更した後にそのオブジェクトを使用した場合の将来のパフォーマンスへの影響も考慮する必要があります。

次の 2 つが考えられます。

  1. プロパティが削除されると、それにアクセスすると、JavaScriptはプロトタイプ チェーンでそれを検索しますが、プロパティがまだオブジェクトに (undefined値とともに) 存在する場合、プロトタイプ チェーンは検索されません。

  2. プロパティを削除すると、「オブジェクトの形状」が変化し、JavaScript の最適化が損なわれる可能性があります。

于 2016-12-20T06:50:30.427 に答える
4
于 2012-12-20T23:55:09.323 に答える
2

プロパティを削除しても、それを undefined に設定するのと同じことはプログラム的に行われないため、どのようなプログラミング結果が必要かによって異なります。

delete Foo['bar'];barオブジェクトからプロパティを削除しFooます。誰かが の直接のプロパティを反復すると、そこにはありませんFoo

Foo['bar'] = undefinedプロパティを未定義に設定しますが、オブジェクトにはまだ存在し、存在し続けますが、値はundefinedです。

したがって、プロパティを削除する場合は、 を使用しますdelete。プロパティをそのままにして、undefined値を設定する場合は、 に設定しundefinedます。

どちらが最速かを知りたいだけで、なんらかの理由でプログラミングの違いを気にしない場合は、jsperf.com にアクセスして、2 つの比較テスト ケースを作成し、関連するさまざまなブラウザーで jsperf を実行してください。あなた。すべてのパフォーマンスに関する質問は、関連する実際のテストで回答する必要があります。

于 2012-12-21T00:19:19.473 に答える