什么更有效?:
var text="ABCdef";
var lowerVersion=text.toLowerCase();
if (lowerVersion=='abcdef' || lowerVersion=='asdfgh' || lowerVersion=='zxcvbn'){...
或
var text="ABCdef";
if (text.toLowerCase()=='abcdef' || text.toLowerCase()=='asdfgh' || text.toLowerCase()=='zxcvbn'){...
即。变量创建比运行toLowerCase()几次更昂贵吗?
感谢。
答案 0 :(得分:2)
这是JavaScript。答案将是:取决于。这取决于您使用的引擎,数据,上下文中的其他内容,第一个或最后一个匹配是否匹配,星期二...
但是在JavaScript中创建变量非常快。相反,重复调用版本要求解释器进行多个函数调用,并且与大多数其他操作相比,函数调用(通过任何实际测量快速调用)都很慢。唯一可行的方法就是解释器可以找出它可以缓存调用的结果,这很棘手。
Taking @Felix's performance test and making it pessimistic(例如,最糟糕的情况,但没有一个匹配)表明,即使Chrome无法对其进行足够的优化,也不会使重复的函数调用变得更糟。我没有做任何全面的测试,但是Chrome,Firefox和Opera都出现了大约60%的速度。
当然,你有另一种选择:
var text="ABCdef";
switch (text.toLowerCase()) {
case 'abcdef':
// ...
break;
case 'asdfgh'
// ...
break;
case 'zxcvbn'
// ...
break;
}
所有这些都是过早的优化,但这种情况一般都很糟糕,但是对于JavaScript以及运行复杂的各种环境而言尤其糟糕。
更好的问题是:什么更清晰,更易于维护?
答案 1 :(得分:1)
Caching seems faster,这似乎是合乎逻辑的(3 toLowerCase调用vs 1)。但我不认为它会影响很多,如果它是一次或几次操作。这可能是一个品味问题,但我认为分配变量更具可读性/可维护性。
答案 2 :(得分:1)
毫无疑问,第二次实施将比第一次实施快得多。
可以肯定的是,每次text.toLowerCase()
花费时间O(n)
时会有3xO(n) vs O(n)
我在jsPref.com上运行了测试,第二个片段的速度提高了18%。
答案 3 :(得分:1)
如果要多次引用该值,请将其存储为变量:toLowerCase()对于长字符串可能会非常慢。