http://jsperf.com/in-vs-member-object-accessを参照してください
基本的に、チェックがif ('bar' in foo) {}
よりも大幅に遅いのはなぜif (foo.bar !== undefined) {}
ですか?
http://jsperf.com/in-vs-member-object-accessを参照してください
基本的に、チェックがif ('bar' in foo) {}
よりも大幅に遅いのはなぜif (foo.bar !== undefined) {}
ですか?
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 を返します。
あなたが正しい。"bar" in foo
が より遅いのは意味がありませんfoo.bar
。
それほど高速ではない唯一の理由は、JIT エンジニアから、より一般的な構文in
ほど注目されていないことです。foo.bar
特に、プロパティがそれ自体の直接プロパティとして存在するjsperfテストの場合(プロトタイプではない) 、. どちらかといえば、それはより速いはずです。2 つの主な違いは、プロパティの値を確認しなくても答えられることです。foo
'bar' in foo
foo.bar !== undefined
in
このfoo.bar
場合、V8 エンジンと SpiderMonkey エンジンの両方が、コードが何の役にも立たないこと (つまり、目に見える効果がないこと) を検出し、完全に最適化してしまうことを期待しています。ベンチマークは、実際の作業を測定していません。
どうやらエンジンは を最適化するほどスマートではないようです"bar" in foo
が、それは時間の問題です。そして優先順位。