在JS数组中使用命名键

时间:2015-09-13 15:35:29

标签: javascript arrays

我正在使用The Principles of Object-Oriented 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);
});

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

  

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

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

1 个答案:

答案 0 :(得分:6)

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

编辑:几乎一切都是一个对象(有人可能会尝试在undefined上设置一个属性,因为JavaScript中最常见的一个错误是{ {1}}。叹息 JavaScript,你为什么要这样对我们?