- js中的数组不同于C、C++...中的数组
c++中是申请一块连续的内存,比如数组类型是int,申请一个长度为4的数组,就会申请16个字节长度的数组
假设其实地址是1201,也就是a[0]的地址,当你需要访问a[3]的时候,只需要访问1201+3*4地址就是a[3]的值。
js中的数组其实是一个hash-map 数据结构,因此你可以在一个数组中插入不同类型的数据结构,当你需要访问a[2]的值时候,他需要通过遍历进行查找
因此JavaScript的数组不同于实际的数组,因此实际的数组通过数组计算获取值得方式会比JavaScript的链表数据快很多,如果数组很长,这种情况会更糟糕
es6 提供了ArrayBuffer 接口
. ArrayBuffer提供了一块连续的内存块mdn 地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays
提供一个长度为2的短整型数组
let buffer = new ArrayBuffer(8);
let view = new Int32Array(buffer); // 4 bytes
view[0] = 100;
- 应该避免给数组中push对象,因为这样会大大降低数组的性能
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