- js中的數(shù)組不同于C、C++...中的數(shù)組
c++中是申請(qǐng)一塊連續(xù)的內(nèi)存,比如數(shù)組類(lèi)型是int,申請(qǐng)一個(gè)長(zhǎng)度為4的數(shù)組,就會(huì)申請(qǐng)16個(gè)字節(jié)長(zhǎng)度的數(shù)組
假設(shè)其實(shí)地址是1201,也就是a[0]的地址,當(dāng)你需要訪(fǎng)問(wèn)a[3]的時(shí)候,只需要訪(fǎng)問(wèn)1201+3*4地址就是a[3]的值。
js中的數(shù)組其實(shí)是一個(gè)hash-map 數(shù)據(jù)結(jié)構(gòu),因此你可以在一個(gè)數(shù)組中插入不同類(lèi)型的數(shù)據(jù)結(jié)構(gòu),當(dāng)你需要訪(fǎng)問(wèn)a[2]的值時(shí)候,他需要通過(guò)遍歷進(jìn)行查找
因此JavaScript的數(shù)組不同于實(shí)際的數(shù)組,因此實(shí)際的數(shù)組通過(guò)數(shù)組計(jì)算獲取值得方式會(huì)比JavaScript的鏈表數(shù)據(jù)快很多,如果數(shù)組很長(zhǎng),這種情況會(huì)更糟糕
es6 提供了ArrayBuffer 接口
. ArrayBuffer提供了一塊連續(xù)的內(nèi)存塊mdn 地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays
提供一個(gè)長(zhǎng)度為2的短整型數(shù)組
let buffer = new ArrayBuffer(8);
let view = new Int32Array(buffer); // 4 bytes
view[0] = 100;
- 應(yīng)該避免給數(shù)組中push對(duì)象,因?yàn)檫@樣會(huì)大大降低數(shù)組的性能
let LIMIT = 10000000;
let arr = new Array(LIMIT);
console.time("1");
arr.push({ a: 22 })
for (let i = 0; i < LIMIT; i++) {
arr[i] = i;
}
console.timeEnd("1");
771 ms
let LIMIT = 10000000;
let arr = new Array(LIMIT);
console.time("1");
for (let i = 0; i < LIMIT; i++) {
arr[i] = i;
}
console.timeEnd("1");
20 ms
let LIMIT = 10000000;
let arr = new Array(LIMIT);
console.time("1");
// arr.push(1)
for (let i = 0; i < LIMIT; i++) {
arr[i] = i;
}
console.timeEnd("1");
// 14 ms
let LIMIT = 10000000;
let arr = new Array(LIMIT);
console.time("1");
// arr.push(1)
for (let i = 0; i < LIMIT; i++) {
arr[i] = i;
}
console.timeEnd("1");
// 909 ms