在JS数组中使用命名键

Hen*_*all 7 javascript arrays

我正在研究面向对象的Javascript原理,并且与Zakas在数组中使用命名键(而不是在对象内部)相混淆.见评论:

function EventTarget() {}

EventTarget.prototype = {

    constructor: EventTarget,

    addListener: function(type, listener) {

        if (!this.hasOwnProperty("_listeners")) {
            // Why isn't this: `this._listeners = {};`
            this._listeners = [];
        }

        if (typeof this._listeners[type] === "undefined") {
            this._listeners[type] = [];
        }

        this._listeners[type].push(listener);
    },

    // more stuff
}

var target = new EventTarget();
target.addListener("message", function(event) {
    console.log("Message is " + event.data);
});
Run Code Online (Sandbox Code Playgroud)

他的代码工作正常(如果你用数组替换对象文字就行了),但我的理解是如果你想按名称访问内容,你应该使用一个对象.来自w3schools数组文章:

许多编程语言支持具有命名索引的数组.
具有命名索引的数组称为关联数组(或哈希).
JavaScript并没有支持数组名为索引.
在JavaScript中,数组始终使用编号索引.

Zakas是否有充分的理由使用这样的阵列?你能解释一下吗?或者,这是我应该提交给勘误的内容吗?

Lor*_*sum 6

我能看到的唯一原因是:让人困惑.JavaScript并没有强制执行任何东西,因为一切都是对象,你可以做任何你想要的事情.这家伙正在使用数组存储命名属性,但他很可能已经使用了函数或其他任何东西!

编辑:几乎所有东西都是一个对象(有人可能会试图设置一个属性undefined,因为JavaScript中最常见的错误之一是TypeError : undefined is not an object.叹息 JavaScript,为什么你这样对我们?

  • “一切都是对象”。不是全部! (2认同)
  • Undefined 不是一个对象... `typeof undefined === "undefined"` (2认同)