当循环复杂度为 O(n) 时,减少每次迭代的工作量是最有效的方法。
当复杂度大于 O(n) 时,建议着重减少迭代次数。
这样避免了每次执行循环都要先去找array.length
for (let i = 0; i < array.length; i++) {
console.log(i) // 0 1 2
}
// 优化后
for (let i = 0, len = array.length; i < len; i++) {
console.log(i) // 0 1 2
// do sth...
}
复制代码
for (let i = array.length; i > 0; i--) {
console.log(i) // 3 2 1
}
// 优化后
for (let i = array.length - 1; i >= 0; i--) {
console.log(i) // 2 1 0
}
// 优化后
for (let i = array.length; i--;) {
console.log(i) // 2 1 0
// do sth...
}
复制代码
在JavaScript提供的循环类型中,只有for-in循环比其他几种明显要慢。
由于每次迭代操作会同时搜索实例或原型属性,for-in循环的每次迭代都会产生更多开销,所以比其他循环类型要慢。
因此,除非你明确需要迭代一个属性数量未知的对象,否则应避免使用for-in循环。
例如:forEach
基于函数的迭代提供了一个更为便利的迭代方法,但它仍然比基于循环的迭代要慢一些。对每个数组调用外部方法所带来的开销是速度慢的主要原因。在所有情况下,基于循环的迭代比基于函数的迭代快8倍,因此在运行速度要求严格时,基于函数的迭代不是更好的选择。
除非在非真既假的判断中,其余条件判断时多用 switch-case 语句,少用 if/else-if/else 语句。原因如下:
支持关联操作,即不写 break 语句
本质是汇编时生成的跳转表来指示 case 的地址,所以每一个 case 的执行时间基本是相同的,执行效率不会受先后顺序的影响
代码更清晰,可读性和可维护性要高很多
当有大量离散数据的时候,使用查找表比使用if-else和switch-case快得多。
// 将返回值集合存入数组
const results = [result0, result1, result2, result3, result4]
// 返回结果
return results[value]
复制代码
var func1 = x => x
func1(2) // 2
var func2 = x => {x}
func2(2) // undefined
var func3 = x => ({x})
func3() // {x: undefined}
func3(2) // {x: 2}
当循环复杂度为 O(n) 时,减少每次迭代的工作量是最有效的方法。
当复杂度大于 O(n) 时,建议着重减少迭代次数。
这样避免了每次执行循环都要先去找array.length
for (let i = 0; i < array.length; i++) {
console.log(i) // 0 1 2
}
// 优化后
for (let i = 0, len = array.length; i < len; i++) {
console.log(i) // 0 1 2
// do sth...
}
复制代码
for (let i = array.length; i > 0; i--) {
console.log(i) // 3 2 1
}
// 优化后
for (let i = array.length - 1; i >= 0; i--) {
console.log(i) // 2 1 0
}
// 优化后
for (let i = array.length; i--;) {
console.log(i) // 2 1 0
// do sth...
}
复制代码
在JavaScript提供的循环类型中,只有for-in循环比其他几种明显要慢。
由于每次迭代操作会同时搜索实例或原型属性,for-in循环的每次迭代都会产生更多开销,所以比其他循环类型要慢。
因此,除非你明确需要迭代一个属性数量未知的对象,否则应避免使用for-in循环。
例如:forEach
基于函数的迭代提供了一个更为便利的迭代方法,但它仍然比基于循环的迭代要慢一些。对每个数组调用外部方法所带来的开销是速度慢的主要原因。在所有情况下,基于循环的迭代比基于函数的迭代快8倍,因此在运行速度要求严格时,基于函数的迭代不是更好的选择。
除非在非真既假的判断中,其余条件判断时多用 switch-case 语句,少用 if/else-if/else 语句。原因如下:
支持关联操作,即不写 break 语句
本质是汇编时生成的跳转表来指示 case 的地址,所以每一个 case 的执行时间基本是相同的,执行效率不会受先后顺序的影响
代码更清晰,可读性和可维护性要高很多
当有大量离散数据的时候,使用查找表比使用if-else和switch-case快得多。
// 将返回值集合存入数组
const results = [result0, result1, result2, result3, result4]
// 返回结果
return results[value]
复制代码
var func1 = x => x
func1(2) // 2
var func2 = x => {x}
func2(2) // undefined
var func3 = x => ({x})
func3() // {x: undefined}
func3(2) // {x: 2}
Share Dialog
Share Dialog

Subscribe to John

Subscribe to John
<100 subscribers
<100 subscribers
No activity yet