【问题标题】:JavaScript - Why can I set keys in an Array?JavaScript - 为什么我可以在数组中设置键?
【发布时间】:2016-05-16 16:22:26
【问题描述】:

我以为我对 JavaScript 的了解相当不错,直到遇到其他开发人员的代码让我崩溃:

var data = [];

从它的名字可以看出,它应该被用作一个关联数组(即Object),但它是一个Array。然后他将值分配给该数组的键:

data['somekey'] = 'somevalue';

我认为这在 JavaScript 中是不可能的,我认为它会抛出异常,但它确实有效。为什么它有效?如果我们可以使用数组来代替,我们为什么需要对象呢?这是否被认为是一种不好的做法,我应该羞辱那个开发人员吗?

【问题讨论】:

  • 试试这个:typeof [];
  • “我应该让那个开发者蒙羞吗?”:不要这样做。
  • Array 实例是对象,因此您可以在它们上设置属性。但是您设置的属性不会通过正常方式(for of 循环、Array.prototype.forEach 等)进行迭代,除非它们是正整数键
  • 一切都是javascript中的对象。同样的方式,你可以使用这个 sintaxe obj['item'] 从对象调用索引

标签: javascript arrays associative-array


【解决方案1】:

之所以有效,是因为数组只是对象的一种特殊情况。事实上,看看这个:

typeof []; // "object"

数组为开发人员提供了额外的方法,例如推送、弹出等,并允许内部引擎根据它们的使用方式更好地优化它们。

一般来说,关联数组最好使用普通对象,因为这本质上就是对象。在这种情况下,没有真正的理由将数组用作“关联数组”。同样,JS 引擎通常会将对象优化为类似 hashmap 的结构,如果您尝试以相同的方式使用普通数组,这可能会发生也可能不会发生。

【讨论】:

    【解决方案2】:

    javascript 中的几乎所有对象都以某种方式派生自散列对象。正是通过这个散列,像数组这样的对象存储了它们自己的内部属性,并允许它们被扩展和覆盖。

    例如,以下所有内容都计算为“对象”:

    typeof(null)
    typeof([])
    typeof({})
    typeof(function(){}.prototype)
    typeof(new function(){})
    

    【讨论】:

    • 好吧,typeof null 只返回“object”,因为算法说“如果值为 null,则返回 'object'”。
    【解决方案3】:

    在内部,JavaScript 只有对象(和原始类型)。对象是键值对的无序集合,其中键是字符串,值可以是任何 JavaScript 类型。

    数组虽然在外观上看起来像任何其他语言的普通数组,但实际上是对象的一种特殊情况,具有本机支持的语言语法。

    >typeof []
     "object" 
    
    >Object.prototype.toString.call([]) 
    "[object Array]"
    

    【讨论】:

      【解决方案4】:

      数组是具有一些附加功能的对象,专门用于以类似列表的方式更轻松地使用数字键。所以是的,您也可以像普通对象一样为它们分配属性。保留这些能力。

      至于为什么你需要对象...因为没有对象就不会成为 javascript。 JS 中的大多数东西都是对象。这正是您通过注意到您可以将数组视为对象来解决的问题。 当您发现对象是 JS 中大多数事物的基础时,从不需要对象的结论中得出结论有点倒退!

      【讨论】:

        【解决方案5】:

        在 JavaScript 中,所有内容实际上都只是键值对,看看 @this -- 我在这里整理了一个简单的示例,然后点击 Run 按钮右上角。

        【讨论】:

          【解决方案6】:

          众所周知,JS 中的一切都是对象,它们是键:值对。 数组在内部也是对象。

          var arr = ["this","is","array"];
          

          在 JS 中定义 this 时,内部会定义为一个以 key 为索引的对象。

          arr = {0 : "this", 1 : "is", 2 : "array"}.
          

          Array 也是一个封装在 Object 类上的类,它具有访问值的其他方法。

          希望对你有所帮助。

          【讨论】:

          • “JS 中的一切都是对象,它们是键:值对”:没有。有些值不是对象。不,内部数组不是对象的包装器(不在任何常见的 JS 引擎中)。
          • 如果我们检查原型链,那么最终继承它的类将是 Object 类。这不是真的吗。 var aa = []; aa.__proto__.__proto__ = 对象类?? “有些值不是对象”-> 你能详细说明一下吗?
          • "3" 和 NaN 是 JS 值,但不是对象。至于内部,任何 JS 引擎都使用优化的数组来实现密集数组(其中一些甚至在可以优化的情况下使用类型化数组,如短整数数组)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-13
          • 2011-02-05
          • 2018-10-06
          • 2011-04-26
          • 2013-07-07
          • 1970-01-01
          相关资源
          最近更新 更多