我正在寻找一种方法来避免对每个arr[i]
进行typeof
检查
我需要考虑arr[i]
可以是0
这一事实
如果arr[i]
是undefined
或大于num
,我想分配arr[i] = num
回答性能问题的方法是运行基准测试。
有四种选择:
-
arr[i] === undefined || num < arr[i]
-
typeof arr[i] === 'undefined' || num < arr[i]
-
CCD_ 11。这假设
undefined
值是真正的"孔"(缺少索引),而不是存在但值为undefined
的索引。 -
!(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;