字符串作为javascript中数组的键

abu*_*uba 39 javascript arrays

为什么使用字符串作为数组的键,控制台显示没有这些声明值的数组,并且在没有显示键为字符串的值时进行迭代?虽然我可以获得它们的价值.

>> var arr = [ 0, 1, 2, 3 ];
   undefined

>> arr["something"] = "aught";
   "aught"

>> arr
   [0, 1, 2, 3]

>> arr["something"]
   "aught"

>> for( var i = arr.length; i--; console.log( arr[ i ] ) );
   3
   2
   1
   0
Run Code Online (Sandbox Code Playgroud)

我知道数组是在javascript引擎中实现了某种"枚举"接口的对象.最有趣的是,解释器不会抛出任何警告或错误,因此我花了一些时间来搜索数据可能丢失的位置.我现在,我错了,我用console而不是console

Dar*_*rov 83

在javascript中有两种类型的数组:标准数组和关联数组

  • [ ] - 标准数组 - 仅基于0的​​整数索引
  • { } - 关联数组 - javascript对象,其中键可以是任何字符串

所以当你定义:

var arr = [ 0, 1, 2, 3 ];
Run Code Online (Sandbox Code Playgroud)

您正在定义一个标准数组,其中索引只能是整数.当你这样做arr["something"],因为something(这是你作为指数使用什么)是不是你基本上是定义一个属性到一个整数arr对象(一切都在JavaScript对象).但是你没有在标准数组中添加元素.

  • 这主要是术语问题,但javascript通常不会将`{}`称为关联数组.他们称之为具有属性的对象.难道大多数人都不同意最好不要通过将javascript对象称为关联数组来混淆事物吗? (23认同)
  • 这真的很奇怪,因为在控制台中, `var a = []; a['测试'] = ""; a;` 显示 `['test': ""]` 因此 `a.length` 如预期为空。这也很奇怪,因为如果我们添加类似“a[0] = 0;”的内容,那么两个键“o”和“test”都有一个属性“a”,这很难理解! (3认同)
  • @abuduba,因为没有错:-)您的代码是完全有效的JavaScript.它对读者来说是模糊的,因为你混合了2种类型的数组,但它是有效的.为什么在没有任何错误的情况下,您希望解释器指出出错的地方. (2认同)

fan*_*gen 11

for( var i = arr.length; i--; console.log( arr[ i ] ) );

当然,这只会给你数字索引,但你仍然可以循环遍历数组的数字索引字符串键,如下所示:

for (var x in arr) {
    console.log(x + ": " + arr[x]);
}
/* (console output):
     0: 0
     1: 1
     2: 2
     3: 3
     something: aught
*/
Run Code Online (Sandbox Code Playgroud)