我遇到的一个问题是,javascript中的不同数据类型有多少使用内存。例如,在C ++数据类型中,如int,char,float使用2,1,8字节的内存顺序。现在数据类型像数字,字符串,布尔值,空,undefind和对象,javascript中的数组使用多少内存以及接受的范围是多少? 接受我的道歉,因为我的英语水平很低!!!
答案 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个字节。
找到代码here和here。完整的代码实际上用于获取对象的粗略大小。
虽然在进一步阅读后,我在此页面上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 等低级语言编写,内存管理委托给这些语言使用的内容。