哪个占用更少的内存:Javascript数组还是Javascript对象?

哪个占用更少的内存:Javascript数组还是Javascript对象?,javascript,Javascript,如果我有一个Javascript列表,它只有数字键,占用更少的内存 var array = []; array[0] = 'hello'; array[5] = 'world'; array[50] = 'foobar'; var obj = {}; obj[0] = 'hello'; obj[5] = 'world'; obj[50] = 'foobar'; 我对Javascript引擎的内部结构一无所知,所以 我之所以问这个问题,是因为数组在转换成字符串时,中间会有一堆未定义的数组。这些

如果我有一个Javascript列表,它只有数字键,占用更少的内存

var array = [];
array[0] = 'hello';
array[5] = 'world';
array[50] = 'foobar';

var obj = {};
obj[0] = 'hello';
obj[5] = 'world';
obj[50] = 'foobar';
我对Javascript引擎的内部结构一无所知,所以


我之所以问这个问题,是因为数组在转换成字符串时,中间会有一堆未定义的数组。这些是以某种方式存储的,还是仅在字符串转换时输入的?

可能是Javascript数组,因为您“只能”使用数字键值,而对象文本为键值提供了空间,即使您使用数字键值,它们的处理方式可能与数组的数字键值不同


数组不能具有基于文本的键值的原因很可能是因为它们与对象文字的处理方式不同。我猜,因为它们可能被不同地对待,所以数组的处理可能会针对数字键值进行更优化,因为对象文本被优化为使用字符串或数字作为键

数组基本上是一组与单个变量名关联的有序值

在您的示例中,我认为您尝试使用关联数组,并且应该使用object,数组并不用于键/值对

此外,当您将值分配给具有当前数组长度更高长度的索引时,数组长度也会独立增加:

var array = new Array();
array[99] = "Test";
// array.length is now 100

检查这个主题。

JavaScript不像其他语言那样实现数组,因此您不会得到普通数组固有的任何性能增强(内存方面);在JavaScript中,数组与对象非常相似;实际上,它本质上是一个对象,只有一些额外的方法和功能(例如更新自身的长度)。我认为两者都不快

数组可以有“基于文本的键值”。。。数组只是对象(至少在JS中是这样)。这是错误的——所有JS实现都有数组的“高效”实现,至少它们比普通对象的效率高很多。他们都假设紧凑阵列是标准阵列,稀疏阵列是不常见的,因此优化“正常”阵列使用。非常简单的性能测试会显示:要回答您的最后一个问题(“这些是以某种方式存储的吗?”),不,它们没有存储,是的,这只是字符串转换的一部分。(尽管对于这种情况,您仍然应该使用对象而不是数组。)请注意,这实际上并不会增加数组占用的内存量(或者至少不应该增加,某些浏览器可能无法很好地处理这种情况)。
.length
属性只返回定义为+1的最后一个数字索引,这就是您看到该行为的原因。但我同意,无论出于何种原因,都应该使用对象。