JavaScript Performance (typeof arr[i] === "undefined" || num < arr[i])



我正在寻找一种方法来避免对每个arr[i] 进行typeof检查

我需要考虑arr[i]可以是0 这一事实

如果arr[i]undefined或大于num,我想分配arr[i] = num

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

有四种选择:

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

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

  3. CCD_ 11。这假设undefined值是真正的"孔"(缺少索引),而不是存在但值为undefined的索引。

  4. !(num >= arr[i])。这利用了与CCD_ 15的比较返回CCD_。

1和2在性能方面是等效的。3大约慢20倍。4慢大约20%。如在另一个答案中所建议的那样使用isNaN大约慢50%。

因此,如果您纯粹对性能感兴趣,请使用1或2。如果您想节省击键次数,只需花费少量的性能成本,请使用4。然而,4的可读性也较差,您可能需要添加一条关于它如何处理undefined的注释,这将抵消任何按键节省。

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

检查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]))

另一方面

  • 如果您不知道当前速度太慢,而如果您没有对其进行分析,则不应该对其进行优化。请参阅:何时进行优化为时过早?

  • 为什么列表中一开始就有未定义的数据?难道你不能在写清单之前,而不是在阅读时过滤掉吗?一个合同中总是只有一种数据类型是个好主意(除非你有充分的理由)

  • 如果你有一个键->值映射,其中一些键没有定义,那么Array可能不是你用例的合适容器

试试这个:

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;

相关内容

最新更新