javascript与undefined比较的成本

时间:2013-09-26 00:28:19

标签: javascript performance

在搞乱JavaScript时我发现将数组元素与undefined进行比较非常有趣。考虑到:

L = [1,2,3];
if (L[1] == undefined)
  console.log('no element for key 1');
else
  console.log('Value for key 1'+L[1]);

我认为这是检查JavaScript中序列中的值的一种很棒的方法,而不是迭代序列或其他容器,但我的问题是:是容易出错还是效率不高?这种比较的代价是什么?

2 个答案:

答案 0 :(得分:0)

代码不会测试特定值是否存在;它测试[Array]索引是否分配一个非未定义的值。 (由于使用null,它也会错误地检测到==之类的误报值,但那是另一个问题..)

考虑一下:

L = ["hello","world","bye"]
a = L["bye"]
b = L[1]

a的价值是什么?它对“再见”的评价是什么? b的价值是什么?1与可能(或可能不)作为L的元素存在的任何值相关?

也就是说,迭代一个数组 - 找到未知索引的值?对多个值执行操作? - 并且按索引访问元素是两个不同的操作,通常不能互换。


另一方面,对象属性可用于实现类似(但有用)的效果:

M = {hello: 1, world: 1, bye: 1}
c = M["hello"]

现在c的价值是多少?作为密钥使用的值如何与数据相关?

在这种情况下,属性名称(用作查找键)与正在检查的数据有关,可以说一些有用的东西 - 是的,有 是“你好”! (这可以在不使用hasOwnProperty的情况下检测到一些误报,但那是另一个问题..)


当然..对于一个小序列或不常见的操作,迭代(或使用像Array.indexOfArray.some这样的方便方法)来查找值的存在是“很好”并且不会导致“性能影响”。

答案 1 :(得分:0)

在V8中访问数组越界以引出undefined是非常缓慢的,因为例如如果它在优化的代码中完成,优化的代码将被抛弃并且被去优化。在其他语言中,会抛出一个非常非常慢的异常,或者在非托管语言中,您的程序会有未定义的行为,例如,如果您幸运的话会崩溃。

因此,请务必检查集合的.length,以确保您不会进行越界访问。

此外,性能优于void 0而不是undefined,因为它是编译时常量而不是运行时变量查找。