最近在刷leetcode,從而產(chǎn)生這個(gè)疑問(wèn)卡睦,從算法時(shí)間復(fù)雜度上面來(lái)說(shuō)宴胧,兩者都是
o(n)
,但是通過(guò)實(shí)際運(yùn)行代碼的情況來(lái)說(shuō)表锻,兩者還是有區(qū)別的恕齐。
- 代碼測(cè)試
創(chuàng)建一個(gè)長(zhǎng)度為100萬(wàn)條的數(shù)組,然后分別用for和forEach遍歷這個(gè)數(shù)組
const arr = [];
for (let i = 0; i < 10000 * 100; i++) {
arr.push(i);
}
const length = arr.length;
console.time("for");
let n1 = 0;
for (let j = 0; j < length; j++) {
n1++;
}
console.timeEnd("for"); // for: 2.452880859375 ms
console.time("forEach");
let n2 = 0;
arr.forEach(() => n2++);
console.timeEnd("forEach"); // forEach: 11.758056640625 ms
- 得出結(jié)論
從上面代碼中可知for的時(shí)間要比f(wàn)orEach少
- 為什么for比f(wàn)orEach更快瞬逊?
- for直接在當(dāng)前函數(shù)中執(zhí)行显歧,forEach每次都會(huì)新創(chuàng)建一個(gè)函數(shù)。
- 函數(shù)有單獨(dú)的作用域和上下文(堆棧模型)确镊,所以會(huì)有額外的開(kāi)銷士骤,耗時(shí)更久。
- 為什么for比f(wàn)orEach更快瞬逊?
- 但是在日常開(kāi)發(fā)中蕾域,不僅僅要考慮性能拷肌,還要考慮代碼的
可讀性
到旦,forEach的可讀性會(huì)更好,且日常中也極少會(huì)一次性處理100萬(wàn)條數(shù)據(jù)巨缘。