Javascript数组查找效率:关联与存储关联?

how*_*his 5 javascript arrays performance

我一直在阅读,他们说联想数组不会给你与数组相同的效率.关联数组可以在O(N)时间内查找,其中数组可以在O(1)中查找.

这是我的问题:哪一个在快速查找值而不占用太多内存方面会更有效率?

联想:

var myVars=new Array(); 
myVars['test1'] = a;
myVars['test2'] = b;
myVars['test3'] = c;
... (up to 200+ values)

echo myVars['test2'];
Run Code Online (Sandbox Code Playgroud)

存储关联:

var myVars=new Array(); 
var TEST1 = 1;
var TEST2 = 2;
var TEST3 = 3;
... (up to 200+ values)

myVars[TEST1] = a;
myVars[TEST2] = b;
myVars[TEST3] = c;
... (up to 200+ values)

echo myVars[TEST2];
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 11

首先,第一次使用Array是错误的.尽管可以这样做,但这并不意味着你应该这样做.你正在"滥用"数组也是对象的事实.这可能会导致意外的行为,例如,虽然你加200个值,myVars.length会0.

不要将JavaScript数组用作关联数组.使用普通对象:

var myVars = {}; 
myVars['test1'] = a;
myVars['test2'] = b;
myVars['test3'] = c;
Run Code Online (Sandbox Code Playgroud)

其次,在JavaScript中,两者(对象和数组)之间没有真正的区别.数组扩展对象并添加一些行为,但它们仍然是对象.元素存储为数组的属性.

您可以在规范中找到更多信息:

数组对象对特定类的属性名称进行特殊处理.当且仅当ToString(ToUint32(P))等于P且ToUint32(P)不等于2 32 -1时,属性名P(以String值的形式)是数组索引.(......)

所以两者:

var obj = {'answer': 42};
obj['answer'];
Run Code Online (Sandbox Code Playgroud)

和

var arr = [42];
arr[0];
Run Code Online (Sandbox Code Playgroud)

具有相同的访问时间†,这绝对不是 O(n).

†:最好说应该有.显然,这在不同的实现中有所不同.


除此之外,你的第二个例子很难维护.如果为变量分配数字,为什么不直接使用数字?

var myVars = []; 
myVars[0] = a;
myVars[1] = b;
myVars[2] = c;
Run Code Online (Sandbox Code Playgroud)

更新:

更重要的是:您必须根据需要选择正确的数据结构,这不仅取决于单个元素的访问时间,还取决于:

  • 键是连续数字还是任意字符串/数字?
  • 您是否必须访问集合中的所有元素(即遍历所有元素)?

数值数组(数组)和关联数组(或哈希表/地图(JS中的对象))为不同的问题提供不同的解决方案.

  • @btilly:这是错误的,因为它令人困惑.我的意思并不是技术错误.例如,如果以这种方式赋值,`arr.length`仍然是'0`.会澄清我的答案...... (2认同)