我正在寻找一种方法来避免每typeof
次arr[i]
检查
我需要考虑arr[i]
可以是0
如果arr[i] = num
为arr[i]
或大于undefined
num
答案 0 :(得分:2)
回答性能问题的方法是运行基准测试。
有四种选择:
arr[i] === undefined || num < arr[i]
typeof arr[i] === 'undefined' || num < arr[i]
!(i in arr) || num < arr[i]
。这假设undefined
值为真&#34;空洞&#34; (缺少索引),而不是存在但值为undefined
的索引。
!(num >= arr[i])
。这利用了与undefined
的比较返回false
的事实。
1和2在性能方面是相同的。 3慢约20倍。 4慢约20%。使用另一个答案中建议的isNaN
约慢50%。
因此,如果您纯粹对性能感兴趣,请使用1或2.如果您想以较低的性能成本保存击键,请使用4.但是,4也不太可读,您可能需要添加注释关于它如何处理undefined
,这将取消任何按键节省。
答案 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可能不是您用例的正确容器