首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript中不同数据类型的内存使用情况

javascript中不同数据类型的内存使用情况
EN

Stack Overflow用户
提问于 2011-02-05 16:22:57
回答 3查看 18.7K关注 0票数 37

我遇到的一个问题是,javascript中不同的数据类型占用了多少内存。例如,在像int、char、float这样的C++数据类型中,float使用2、1、8字节的内存。现在的数据类型,像数字,字符串,布尔值,null,undefind和javascript中的对象,数组,内存使用了多少,接受的范围是什么?接受我的道歉,因为我的英语水平很低!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-10 19:28:01

数字是8个字节。

在这个w3schools page里找到的。

我对其他JavaScript原语类型进行了更多的搜索,但是很难找到这些信息!不过我确实找到了以下代码:

代码语言:javascript
复制
    ...
    if ( typeof value === 'boolean' ) {
        bytes += 4;
    }
    else if ( typeof value === 'string' ) {
        bytes += value.length * 2;
    }
    else if ( typeof value === 'number' ) {
        bytes += 8;
    }
    ...

似乎表示字符串是每个字符2个字节,而布尔值是4个字节。

找到了代码herehere。完整的代码实际上是用来获得对象的粗略大小的。

不过,在进一步阅读后,我在这个页面上发现了由konijn编写的有趣代码:Count byte length of string

代码语言:javascript
复制
function getByteCount( s )
{
  var count = 0, stringLength = s.length, i;
  s = String( s || "" );
  for( i = 0 ; i < stringLength ; i++ )
  {
    var partCount = encodeURI( s[i] ).split("%").length;
    count += partCount==1?1:partCount-1;
  }
  return count;
}
getByteCount("i♥js"); // 6 bytes
getByteCount("abcd"); // 4 bytes

所以看起来字符串在内存中的大小取决于字符本身。尽管我仍然在试图弄清楚,如果计数为1,为什么他会将计数设置为1,否则他会获取count-1 (在for循环中)。

如果我发现了什么,我会更新帖子的。

票数 28
EN

Stack Overflow用户

发布于 2016-11-03 00:26:03

到今天为止,MDN Data Structures页面提供了更多关于它的信息:

根据ECMAScript标准,只有一种数字类型:双精度64位二进制格式IEEE754值

所以这应该是8个字节。

字符串

JavaScript的字符串类型用于表示文本数据。它是一组16位无符号整数值的“元素”。

因此,这应该等于每个字符2个字节。

布尔值

布尔值表示一个逻辑实体,可以有两个值: true和false。

没什么好说的了。

票数 16
EN

Stack Overflow用户

发布于 2021-06-08 19:04:53

值的内存表示,换句话说,它的大小是一个实现细节,除非另有说明,而且可以根据运行时环境的底层代码而有所不同。运行时是运行JavaScript代码的应用程序,即Nodejs、Firefox浏览器或Chrome浏览器。

假设您编写了自己的运行时,并且希望表示一个布尔值。布尔值至少需要一位,因此您可以将其作为一位存储在内存中。

这是真的:

代码语言:javascript
复制

这是错误的:

代码语言:javascript
复制

但是没有什么能阻止你使用8位或1字节的内存空间。这里的最高有效位保存值,其余的将用0填充:

代码语言:javascript
复制
□□□□□□□■

或64位:

代码语言:javascript
复制
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■

同样的事情也适用于字符串值。您可以使用8位或64位甚至更多的位来表示它。然而,语言承诺对任何Unicode值进行操作,但是8位可能不足以表示所有Unicode值。这就是您可以在规范中找到一些寻址和调整的地方。JavaScript中的字符串被视为UTF16编码单元的序列,一些字符占用16位存储空间,另一些字符占用32位存储空间。

代码单元是从Unicode规范中借用的一个术语。你可能会问为什么不是字符而是代码单元,因为字符是表示特定文本数据的一种方式,还有其他方式。例如,é\u00E9\u{E9}都会创建带有急性的字母e。在您的JavaScript字符串中,您可以选择这两个字符串中的任何一个。

数学是棘手的,因为在CPU级别上,所有的计算都是用二进制完成的,而二进制不能顺利地转换成十进制。尝试运行0.1 + 0.1 == 0.3。所以我们需要更严格的控制来保证准确性。这就是为什么规范对数字表示非常具体的原因:双精度64位二进制格式IEEE754。

总而言之,在编写JavaScript运行时时,如何在内存中存储值由您决定,除非在规范中明确指定。这就是为什么有些数据类型对它们应该如何表示和存储在内存中进行了冗长的讨论。

运行时环境通常是用低级语言编写的,比如C、C++或Rust,内存管理被委托给这些语言使用的内容。

如果您是JavaScript程序员,就不必关心内存是如何分配和释放的,因为运行时会为我们处理这一部分。您可能遇到的唯一问题是通过循环引用造成的内存泄漏:对象A引用对象B,对象B引用对象A。开发人员控制台中有一些工具可以检测此类问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4905861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档