【问题标题】:Strings as keys of array字符串作为数组的键
【发布时间】:2011-12-25 16:37:08
【问题描述】:

当使用字符串作为数组的键时,console 显示没有这些声明值的数组,并且在通过该值进行迭代时,键是字符串的情况不会显示? ,虽然我可以得到它们的价值。

>> 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

我知道数组是在 JavaScript 引擎中实现了某种“枚举”接口的对象。

最有趣的是解释器没有抛出警告或错误,所以我花了一些时间寻找可能丢失数据的位置。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

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

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

    所以当你定义:

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

    您正在定义一个标准数组,其中索引只能是整数。当您执行arr["something"] 时,因为something(您用作索引)不是整数,所以您基本上是在为arr 对象定义一个属性(JavaScript 中的一切都是对象)。但是您没有向标准数组添加元素。

    【讨论】:

    • @abuduba,因为没有错 :-) 您的代码是完全有效的 javascript。这对读者来说是模棱两可的,因为您混合了 2 种类型的数组,但它是有效的。你为什么要让解释器在没有任何问题的情况下指出有问题。
    • 这主要是一个术语问题,但 javascript 通常不会将 {} 称为关联数组。他们称其为具有属性的对象。大多数人不同意最好不要通过将 javascript 对象称为关联数组来混淆事物吗?
    • 注意:如果你尝试在数组上使用defineProperty,比如Object.defineProperty.call(arr,'something','aught');,它会抛出一个错误。
    • re right. Key something is property of object instead index of array => arr.something. Maybe I'am too long without sleep .. I forgot that. Thanks @David - Nice, i didnt知道了
    • 这真的很奇怪,因为在控制台中,var a = []; a['test'] = ""; a; 显示['test': ""] 因此a.length 是空的。这也很奇怪,因为如果我们添加类似 a[0] = 0; 这样的东西,'o' 和 'test' 键都具有 'a' 的属性,这很难理解!
    【解决方案2】:

    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
    */
    

    【讨论】:

    • 所以,让我们添加这个Array.prototype.somethingCool = "not really"; 然后运行你的for-in-loop !!
    猜你喜欢
    • 2016-01-14
    • 2020-02-14
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2012-10-03
    • 2017-07-19
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多