当前位置:  开发笔记 > 编程语言 > 正文

使用JavaScript [] literal的数组长度是否真的反映了它在内存中的物理大小?

如何解决《使用JavaScript[]literal的数组长度是否真的反映了它在内存中的物理大小?》经验,为你挑选了1个好方法。

在JavaScript中,有两种方法可以定义数组:

var array = new Array(); // which is not preferred

var array = [];

[编辑纠正误解]事实上,无论我使用[]还是新的Array(),它们总是对象,因为我们可以定义

var object = [];
object["key"] = "value";
console.log(object.key); // gives "value"

我想知道如果使用[]定义一个"数组",如果我有以下代码,那么物理大小是多少:

var array = [];
array[1000] = "value";

如果它的行为类似于一个对象,它的物理大小应该只由键值对[1000] - >"value"组成.但是,如果我使用输出数组的长度属性console.log(array.length);,它给出1001好像在我刚刚插入的[1000] - >"值"之前有1000个元素.

那么使用[]定义的"数组"的内存中的物理大小应该是多少?



1> 小智..:

您的术语"物理尺寸"尚不清楚.你的意思是"数组中定义的元素的数量"?你使用另一个不明确的术语,即"实际大小".

数组(无论如何创建)在其"大小"方面具有以下特征:

    length.这是包含值加1的最后一个元素的索引.

    已定义元素的数量.这小于或等于长度.您可以通过执行类似操作找到它array.reduce(function(n) { return n+1; }, 0),因为reduce跳过未定义的元素.filter也是,所以你也可以这样做array.filter(function() { return true; }).length.

    内部尺寸.作为一个提到的评论者,这是特定于引擎的,并且没有办法或理由让你看到这一点.不同的引擎具有用于管理阵列的内部表示的不同策略,并且它们可以在策略之间切换.因此,一个数组可能表示为连续的内存位置块,但是当它达到特定的稀疏程度时,可能会将其表示更改为更适合稀疏数组的表示.如果它认为阵列可能正在增长,它可能会预先分配内存块.因此,没有办法知道(或理由关心)两个阵列"在内存中占据相同的物理大小".

在另一个主题上,您似乎对数组与对象之间的区别感到困惑.[]并且new Array()是非常多的数组.它们就是阵列.但是,在JS中,数组继承所有对象行为.换句话说,数组是一种特殊的对象,它提供了诸如自动管理length和自己的原型方法等功能.


正如在SO和其他地方所说的无数次,您需要优化时进行优化.当您需要担心性能时,您会担心性能问题.今天的JS引擎经过了高度优化.尝试猜测他们是如何做事以及以某种方式围绕您的猜测进行编码几乎是不值得的,这通常是错误的,或者是无关紧要的.您可以将稀疏数组用于心脏的内容 - 使用一个元素在一亿个位置创建一个数组 - 性能也会很好.
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有