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

JavaScript性能(typeof arr[i]==“undefined”num<;arr[i]),javascript,performance,micro-optimization,Javascript,Performance,Micro Optimization,我正在寻找一种方法来避免在每个arr[I] 我需要考虑arr[I]可以0 如果arr[I]是undefined或大于num请尝试以下操作: arr[i] == undefined || num < arr[i] arr[i]==未定义的| | num=0&&arr[i]

我正在寻找一种方法来避免在每个
arr[I]

我需要考虑
arr[I]
可以
0

如果
arr[I]
undefined
或大于
num
请尝试以下操作:

arr[i] == undefined || num < arr[i]
arr[i]==未定义的| | num

arr[i]=(arr[i]>=0&&arr[i]

arr[i]=(!isNaN(arr[i])&&arr[i]
回答性能问题的方法是运行基准测试

有四种选择:

  • arr[i]==未定义| | num

  • typeof-arr[i]=='undefined'| | num

  • !(arr中的i)| num
    。这假设
    undefined
    值为真“洞”(缺少索引),而不是存在但值为
    undefined
    的索引

  • !(num>=arr[i])
    。这利用了这样一个事实:与
    未定义
    的比较返回
    false

  • 1和2在性能方面相当。3大约慢20倍。4大约慢20%。使用另一个答案中建议的
    isNaN
    大约要慢50%

    因此,如果您只对性能感兴趣,请使用1或2。如果您想以较小的性能代价保存击键,请使用4。但是,4的可读性也较低,您可能需要添加一条注释,说明它如何处理
    未定义的
    ,这将否定任何击键节省


    请参阅。

    检查
    something===something\u other
    的速度是最快的,但让您的代码变慢的是,您正在做两件事,而不是一件事:

    您正在检查arr[i]==“undefined”
    num
    typeofarr[i]==“undefined”
    ,即使javascript引擎仍将检查数据类型

    我的意思是,如果arr[I]==“undefined”
    的类型为真,那么
    num
    将始终为假。对于
    >=
    ,这也将是错误的,这将导致解决方案

    而不是:

    if (typeof arr[i] === “undefined” || num < arr[i])
    
    另一方面
    • 如果您不知道当前速度太慢,如果您没有对其进行分析,则不应该对其进行优化。见:

    • 为什么列表中还有未定义的数据?你不能在写进清单之前,而不是在阅读时过滤掉吗?在container中始终只有一种数据类型是一个好主意(除非您有很好的理由)

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


    为什么它首先是
    未定义的
    ?在数字数组中似乎不是一个有用的值。不管是哪种方式,都不需要
    typeof
    来检查
    undefined
    。这个怎么样:
    arr[i]=Math.max(arr[i]|0,num)
    为什么首先需要让这样简单的逻辑更快?没有比这更快的了。如果(!(num>=arr[i]){arr[i]=num;}
    ,您可以尝试使用
    if(!(num>=arr[i]){arr[i]
    来反转未定义的情况。这将用
    num
    替换
    arr[i]
    的负值,这可能不是OP想要的。在这种情况下,您可以尝试使用isNaN方法
    isNaN
    似乎比直接检查
    未定义的
    要慢50%。看。哦,谢谢你的更新。。对于这种情况,您的第一个选项很酷,但我的建议是不要检查type
    arr[i]==undefined | | num
    arr[i]=(!isNaN(arr[i]) && arr [i] < num) ? arr[i] : num;
    
    if (typeof arr[i] === “undefined” || num < arr[i])
    
    if (!(num >= arr[i]))