关联数组在JavaScript中是如何工作的?

关联数组在JavaScript中是如何工作的?,javascript,language-agnostic,Javascript,Language Agnostic,我知道如何使用它们,但我想知道它们在引擎盖下是如何工作的,与常规阵列相比,它们的速度有多慢 我的猜测是: myArray['value'] = 10; myArray['another_key'] = 11; 翻译成这样: myArray[0][0] = 'value'; myArray[0][1] = 10; myArray[1][0] = 'another_key'; myArray[1][1] = 11; 他们真的是这样工作的吗 当我尝试从关联数组中获取值时会发生什么?从关联数组中获

我知道如何使用它们,但我想知道它们在引擎盖下是如何工作的,与常规阵列相比,它们的速度有多慢

我的猜测是:

myArray['value'] = 10;
myArray['another_key'] = 11;
翻译成这样:

myArray[0][0] = 'value';
myArray[0][1] = 10;
myArray[1][0] = 'another_key';
myArray[1][1] = 11;
  • 他们真的是这样工作的吗
  • 当我尝试从关联数组中获取值时会发生什么?从关联数组中获取值需要多长时间
  • 如果我的处理时间有限(例如在游戏循环中),我是否应该使用它们
[编辑]

看起来我猜错了,数组的键实际上是对象的属性。所以,为了收集我在一个地方得到的所有答案:

  • 关联数组是对象
  • 键是所述对象的属性名称
  • 当您获取数组的特定键的值时,不会执行任何搜索,因为您实际要做的是获取对象属性的值,这几乎不需要花费任何时间

    • Javascript没有关联数组。您可以改为使用对象。
      这是完全不同的

      首先,切勿将数组用作关联数组。数组只能与数字标记一起正常工作。例如:

      var a = [];
      a['foo'] = 'bar';
      console.log(a.length) // prints 0
      
      如果您认为关联数组的元素应该保持一定的顺序(例如,像PHP中那样),那么即使对象也不适合关联数组。事实并非如此。但是对象适合于哈希表,这在大多数情况下已经足够了

      在内部,数组也只是对象。因此,当您有一个数组时:

      var a = [];
      a[0] = 42;
      
      然后,
      0
      实际上被转换为字符串,并作为属性添加到对象中(注意最后一行(
      \uuuuuu proto\uuuuuu:object
      ):

      您也可以使用
      a['0']
      访问该属性

      当然,这些操作可能是针对阵列进行内部优化的,但这取决于引擎

      所以最后,
      a[0]=42
      o['value']=42(使用
      o={}
      )产生相同的结果


      使用
      a[0]
      o['value']
      o.value
      访问它们也是一样的。

      关联数组只是一个对象。设置项目只是设置属性,因此您的代码与:

      myArray.value = 10;
      myArray.another_key = 11;
      

      在对象中查找属性的速度非常快,因此通常不会有任何性能问题。

      您有没有想过用谷歌搜索一下这一点?Javascript中没有关联数组这样的东西。当您执行
      myArray['value']=10
      时,实际上是在创建一个名为
      myArray
      的对象,该对象的属性为
      value
      。这相当于这个
      myArray={value:10}
      MrMisterMan:如果你看到维基百科对关联数组()的定义,我会说JS有它们:“在计算机科学中,关联数组、映射或字典是由(键、值)集合组成的抽象数据类型配对,这样每个可能的键在集合中最多出现一次。”可以说,使用这个术语可能会让人困惑,因为人们没有意识到所有JS对象都是以这种方式运行的。可能重复@simon good point,做得好,先生。说javascript没有关联数组是不正确的——对象是关联数组(以及更多)。