JavaScript性能(typeof arr [i] ===“undefined”|| num< arr [i])

时间:2015-12-25 01:57:21

标签: javascript performance micro-optimization

我正在寻找一种方法来避免每typeofarr[i]检查

我需要考虑arr[i]可以是0

的事实

如果arr[i] = numarr[i]或大于undefined

,我想分配num

3 个答案:

答案 0 :(得分:2)

回答性能问题的方法是运行基准测试。

有四种选择:

  1. arr[i] === undefined || num < arr[i]

  2. typeof arr[i] === 'undefined' || num < arr[i]

  3. !(i in arr) || num < arr[i]。这假设undefined值为真&#34;空洞&#34; (缺少索引),而不是存在但值为undefined的索引。

  4. !(num >= arr[i])。这利用了与undefined的比较返回false的事实。

  5. 1和2在性能方面是相同的。 3慢约20倍。 4慢约20%。使用另一个答案中建议的isNaN约慢50%。

    因此,如果您纯粹对性能感兴趣,请使用1或2.如果您想以较低的性能成本保存击键,请使用4.但是,4也不太可读,您可能需要添加注释关于它如何处理undefined,这将取消任何按键节省。

    请参阅http://jsperf.com/ways-to-check-for-undefined/4

答案 1 :(得分:1)

试试这个:

arr[i] == undefined || num < arr[i]

arr[i]=(arr[i] >= 0 && arr [i] < num) ? arr[i] : num;

或者

arr[i]=(!isNaN(arr[i]) && arr [i] < num) ? arr[i] : num;

答案 2 :(得分:1)

检查something === something_else的速度和它一样快,但是使你的代码变慢的原因是你做了两件事而不是一件事:

您正在检查typeof arr[i] === “undefined”num < arr[i],即使 javascript引擎无论如何都要检查数据类型

我的意思是,如果typeof arr[i] === “undefined”属实,那么num < arr[i]将永远是假的。 >=也是错误的,这导致了解决方案。

而不是:

if (typeof arr[i] === “undefined” || num < arr[i])

你可以这样做:

if (!(num >= arr[i]))

另一方面......

  • 如果你不知道它目前太慢了,如果你没有对它进行分析,那么你不应该对它进行优化。请参阅:When is optimisation premature?

  • 为什么你甚至在列表中有未定义的数据?在写入列表之前,而不是在阅读时,你是否无法对其进行过滤?最好总是在一个内容中只有一种数据类型(除非你有其他正当理由)

  • 如果您使用未定义某些键的key-&gt;值映射,则Array可能不是您用例的正确容器