假设您要检查用户在表单域中输入的输入字符串。哪个是根据可能值列表检查此输入的最快方法?
以下示例使用 jQuery。
第一种方法:使用||
if (input == "firstValue" || input == "secondValue" || ... ) {
...
}
第二种方法:使用inArray()
if ($.inArray(input, array) >= 0) {
...
}
这两种方法有什么显着差异吗?
最佳答案
您不想要最快但最易读的方式。对于超过 2 或 3 个值,这就是 in_array()
(JavaScript:array.indexOf(value) >= 0
)。
性能差异可以忽略不计——虽然函数调用和数组创建肯定有一些开销,但与文件访问、数据库访问、网络访问等昂贵的操作相比,这无关紧要。所以最终没有人会注意区别。
这是一个简短的 benchmark ,每个都有 100 万次迭代:
5.4829950332642 - in_array, the array is recreated everytime
2.9785749912262 - in_array, the array is created only once
0.64996600151062 - isset(), the array way created only once and then the values were turned to keys using array_flip()
2.0508298873901 - ||
所以,最快但仍然非常可读的方法就是这样。除非您只创建一次 $arr
并使用它多次 次,否则没有这个必要,您可以简单地使用 in_array()
。
$arr = array_flip(array('your', 'list', 'of', 'values'));
if(isset($arr[$value])) ...
如果您确实要求使用 JavaScript(在本例中去掉那些 $
前缀!),最好的解决方案是使用 Array.indexOf()
:
['a', 'b', 'c'].indexOf(value) >= 0
但是,并非所有浏览器都已经支持 Array.indexOf()
,因此您可能希望使用例如来自 Underscore.js 的函数:
_.contains(['a', 'b', 'c'], value)
jQuery 也有一个函数:
$.inArray(value, ['a', 'b', 'c'])
最快的方法是使用对象和 in
运算符,但对象定义的可读性不如数组定义:
value in {'a':0, 'b':0, 'c':0}
这是各种解决方案的 JSPerf 基准测试:http://jsperf.com/inarray-vs-or - 但同样,在大多数情况下,相当大的性能差异可以忽略不计,因为您不会在循环中执行数百万次代码。
关于javascript - OR 操作 ( || ) 与 inArray() 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10479056/