JavaScript 中数组的内存是如何分配的?

问题描述 投票:0回答:1

我希望下面的程序能够输出 40,000 个字节(200 * 200 * 8 位数组或 1 个字节),但是在插入

159800
时它输出
200
。为什么?

当插入

119800
(
10
) 时输出
subArray[j][0]=10
并在插入
79800
(
1
) 时输出
subArray[j][0]=1
时,它会变得更加混乱,即使它始终是 8 位数组。

如果我将

Uint8Array(1)
更改为
Uint16Array(1)
,则相同数字的输出值完全相同。

数组如何工作?

let x = 200
let y = 200

const changes =[]
for (let i=0;i<y;i++) {
    const subArray = []
    for (let j=0;j<x;j++) {
        subArray[j] = new Uint8Array(1);
        subArray[j][0]=200
    }
    changes[i]=subArray;
}

console.log(new Blob(changes).size);
javascript memory-management utf-8 blob
1个回答
1
投票

您的

subArray
是一个普通数组,恰好填充有 Uint8Array 实例。如果您更改代码,使其变为 200 字节类型数组,您将得到您期望的答案:

let x = 200
let y = 200

const changes =[]
for (let i=0;i<y;i++) {
    const subArray = new Uint8Array(200);
    for (let j=0;j<x;j++) {
        subArray[j] = 200;
    }
    changes[i]=subArray;
}

console.log(new Blob(changes).size); // 40000

规范没有说明如果“blob 部分”之一是类型数组的普通数组会发生什么。它可能正在将数组转换为字符串,但我不能说这在内部到底是如何发生的。

© www.soinside.com 2019 - 2024. All rights reserved.