为什么Javascript的"in"运算符始终比undefined的严格成员比较慢?

Bri*_*ray 13 javascript

请参阅http://jsperf.com/in-vs-member-object-access

基本上,为什么检查if ('bar' in foo) {}明显慢于if (foo.bar !== undefined) {}

Ibu*_*Ibu 5

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.

  • 感谢您直接将此信息发布到您的答案中.我已经接受了答案,但我非常感谢您花时间把它放在这里.我相信别人会发现它非常宝贵. (2认同)