请参阅http://jsperf.com/in-vs-member-object-access
基本上,为什么检查if ('bar' in foo) {}明显慢于if (foo.bar !== undefined) {}?
foo.bar !== undefined 只检查这两个值,看它们是否匹配.
虽然'bar' in foo将不得不使用一些机制来遍历属性,foo看看是否bar在其中.
这是一个有趣的阅读Ecma脚本
在操作员
ShiftExpression中的生产RelationalExpression:RelationalExpression的计算方法如下:
1.评估RelationalExpression.
2.调用GetValue(Result(1)).
3.评估ShiftExpression.
4.调用GetValue(Result(3)).
5.如果Result(4)不是对象,则抛出TypeError异常.
6.调用ToString(结果(2)).
7.使用参数Result(6)调用Result(4)的[[HasProperty]]方法.
8.返回结果(7).严格不等于运算符(!==)
生产EqualityExpression:EqualityExpression!== RelationalExpression的计算方法如下:
1.评估EqualityExpression.
2.调用GetValue(Result(1)).
3.评估RelationalExpression.
4.调用GetValue(Result(3)).
5.执行比较结果(4)===结果(2).(见下文.)
6.如果Result(5)为true,则返回false.否则,返回true.