JavaScript 中的 Sring 和 Array 消耗多少内存?

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

我正在尝试了解字符串和数组使用的内存。根据这个有用的问题:JavaScript 字符串中有多少字节?

Blob
是检查字符串字节大小的好方法:
new Blob(['a']).size
->
1
字节

但是字符串在 JavaScript 中编码为

UTF-16
,最少使用
2 bytes
Blob
如何返回1?

此外,-----

    const x = 200;
    const y = 200;
    
    const changes = []
    
    for (let i=0;i<y;i++) {
        const subItem = []
        changes[i]=new Array(x).fill(new Uint8Array(1));
    }
    console.log(new Blob(changes).size)

上面的数组消耗

79800
而不是
40000
(Uint8Array(1) 的 200*200)。

  1. 为什么上面的数组消耗了我期望的(40000)的两倍(79800)?
  2. 为什么不是精确的80000? 200的损失从哪里来?
  3. 如果我将
    new Array(x).fill(new Uint8Array(1))
    更改为
    new Array(x).fill(''))
    那么它会输出
    39800
    我不明白为什么它消耗 39800,它是空的?
  4. 如果我将其更改为
    new Array(x).fill('a')
    ,那么它会输出“79800”。 我也不明白为什么它消耗双倍(79800)而不是40000,因为
    new Blob(['a']).size
    输出
    1
    字节。
javascript utf-8 utf-16
2个回答
3
投票

Blob
使用 UTF-8 来表示字符串。 UTF-8 的最小字节大小为 1,字符
'a'
可以使用单个字节在 UTF-8 中表示。两字节 UTF-8 字符(例如
'Ђ'
)返回 2,甚至更长的字符(例如复杂的表情符号 (
'😃'
))返回 4。


-2
投票

但是,

new Blob([data])
方法也接受“数据”数组,如果将字符作为数组中的单个元素传递,它可能不会被解释为字符串,而是解释为单个字节。这可能会导致您提到的输出,其中 new Blob(['a']).size 返回 1 。

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