13

http://jsperf.com/in-vs-member-object-accessを参照してください

基本的に、チェックがif ('bar' in foo) {}よりも大幅に遅いのはなぜif (foo.bar !== undefined) {}ですか?

4

2 に答える 2

5

foo.bar !== undefinedこれら 2 つの値だけをチェックして、一致するかどうかを確認します。

while'bar' in fooは、何らかのメカニズムを使用して のプロパティをループし、その中にあるfooかどうかを確認する必要barがあります。

これは興味深い Read from Ecma-script です

in 演算子

プロダクション RelationalExpression : ShiftExpression 内の RelationalExpression は、次のように評価されます。
1. RelationalExpression を評価します。
2. GetValue(Result(1)) を呼び出します。
3. ShiftExpression を評価します。
4. GetValue(Result(3)) を呼び出します。
5. Result(4) がオブジェクトでない場合は、TypeError 例外をスローします。
6. ToString(Result(2)) を呼び出します。
7. パラメータ Result(6) を指定して Result(4) の [[HasProperty]] メソッドを呼び出します。
8. Result(7) を返します。

厳密な不等号演算子 ( !== )

プロダクション EqualityExpression : EqualityExpression !== RelationalExpression は次のように評価されます。
1. EqualityExpression を評価します。
2. GetValue(Result(1)) を呼び出します。
3. RelationalExpression を評価します。
4. GetValue(Result(3)) を呼び出します。
5. 比較 Result(4) === Result(2) を実行します。(以下を参照してください。)
6. Result(5) が true の場合、false を返します。それ以外の場合は true を返します。

于 2012-12-13T18:57:45.997 に答える
4

あなたが正しい。"bar" in fooが より遅いのは意味がありませんfoo.bar

それほど高速ではない唯一の理由は、JIT エンジニアから、より一般的な構文inほど注目されていないことです。foo.bar

特に、プロパティがそれ自体の直接プロパティとして存在するjsperfテストの場合(プロトタイプではない) 、. どちらかといえば、それはより速いはずです。2 つの主な違いは、プロパティの値を確認しなくても答えられることです。foo'bar' in foofoo.bar !== undefinedin

このfoo.bar場合、V8 エンジンと SpiderMonkey エンジンの両方が、コードが何の役にも立たないこと (つまり、目に見える効果がないこと) を検出し、完全に最適化してしまうことを期待しています。ベンチマークは、実際の作業を測定していません。

どうやらエンジンは を最適化するほどスマートではないようです"bar" in fooが、それは時間の問題です。そして優先順位。

于 2014-08-08T20:13:01.720 に答える