我遇到的一个问题是,javascript中不同的数据类型占用了多少内存。例如,在像int、char、float这样的C++数据类型中,float使用2、1、8字节的内存。现在的数据类型,像数字,字符串,布尔值,null,undefind和javascript中的对象,数组,内存使用了多少,接受的范围是什么?接受我的道歉,因为我的英语水平很低!
发布于 2016-05-10 19:28:01
数字是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;
}
...似乎表示字符串是每个字符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循环中)。
如果我发现了什么,我会更新帖子的。
发布于 2016-11-03 00:26:03
到今天为止,MDN Data Structures页面提供了更多关于它的信息:
数
根据ECMAScript标准,只有一种数字类型:双精度64位二进制格式IEEE754值
所以这应该是8个字节。
字符串
JavaScript的字符串类型用于表示文本数据。它是一组16位无符号整数值的“元素”。
因此,这应该等于每个字符2个字节。
布尔值
布尔值表示一个逻辑实体,可以有两个值: true和false。
没什么好说的了。
发布于 2021-06-08 19:04:53
值的内存表示,换句话说,它的大小是一个实现细节,除非另有说明,而且可以根据运行时环境的底层代码而有所不同。运行时是运行JavaScript代码的应用程序,即Nodejs、Firefox浏览器或Chrome浏览器。
假设您编写了自己的运行时,并且希望表示一个布尔值。布尔值至少需要一位,因此您可以将其作为一位存储在内存中。
这是真的:
■这是错误的:
□但是没有什么能阻止你使用8位或1字节的内存空间。这里的最高有效位保存值,其余的将用0填充:
□□□□□□□■或64位:
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■同样的事情也适用于字符串值。您可以使用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。开发人员控制台中有一些工具可以检测此类问题。
https://stackoverflow.com/questions/4905861
复制相似问题