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

时间:2011-02-05 08:22:57

标签: javascript types

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

3 个答案:

答案 0 :(得分:19)

数字是8个字节。

在此w3schools page中找到了。

我为其他JavaScript基元类型搜索了一下,但是很难找到这些信息!我确实找到了以下代码:

    ...
    if ( typeof value === 'boolean' ) {
        bytes += 4;
    }
    else if ( typeof value === 'string' ) {
        bytes += value.length * 2;
    }
    else if ( typeof value === 'number' ) {
        bytes += 8;
    }
    ...

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

找到代码herehere。完整的代码实际上用于获取对象的粗略大小。

虽然在进一步阅读后,我在此页面上konijn找到了这个有趣的代码:Count byte length of string

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循环中)。

如果我发现其他任何内容,我会更新帖子。

答案 1 :(得分:9)

截至今天,operator manual页面提供了有关它的更多信息:

  

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

所以这应该达到8个字节。

字符串

  

JavaScript的String类型用于表示文本数据。它是一组&#34;元素&#34; 16位无符号整数值。

所以每个字符应该达到2个字节。

布尔

  

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

没有更多相关内容。

答案 2 :(得分:1)

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

假设您编写自己的运行时并且想要表示一个布尔值。布尔值至少需要一位,因此您可以将其作为一位存储在内存中。我可以用 0 或 1,为了更清楚,让我们用一个盒子来代表内存空间。

这是真的:

这是错误的:

但是没有什么可以阻止您使用 8 位或 1 字节的存储空间。这里最重要的位保存值,其余的将用 0 填充:

□□□□□□□■

或 64 位:

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■

同样的事情适用于字符串值。您可以使用 8 位或 64 位甚至更多来表示它。然而,语言承诺对任何 Unicode 值进行操作,但 8 位可能不足以表示所有 Unicode 值。这是您在规范中找到一些地址和调整的地方。

数学也很棘手,因为在 CPU 级别,所有计算都是以二进制形式完成的,而二进制不会毫无问题地转换为十进制。尝试运行 0.1 + 0.1 == 0.3。所以我们需要对准确性进行强有力的控制。这就是规范对数字表示非常具体的原因:双精度 64 位二进制格式 IEEE 754。

总结一下,只要有条理,遵循规范,如何在内存中存储值对于用户空间代码来说并不重要。因为我们在存储数据和访问数据时都使用运行时提供的 API。

这就是 ECMAScript 规范中未指明数据大小的原因。

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