0

我正在开发一个使用大量“javascript”的项目。我有很多“ajax”调用,它们总是返回一个“json”数组。出于有用的原因,我创建了 Array 对象的两个原型(“in_array”函数和“shuffle”函数)。

因为我做了原型,我所有的“for in”循环都被打破了(两次显示“未定义”......)我查看了谷歌和stackoverflow,我现在知道我的错误了。当然,如果我删除我的原型,“未定义”就会消失。

但是,我找不到我所有的答案。

首先,我看到很多时候,使用“for in”循环是不好的,为什么?

我也使用“PHP”或“python”进行开发,而且我喜欢“for in”或“foreach”循环。

其次,我有很多“for in”循环,老实说,我更喜欢改变我的原型,而不是改变我的循环。将我的原型切换到正常功能并保持“for in”循环是否很脏?

第三,我读到 JQuery 可以纠正这个错误。我的项目确实有 JQuery,解决方案是什么(我只读到 JQuery 可以纠正这个问题,而不是如何纠正)。

谢谢,

编辑:我的原型代码:

// FONCTIONS ARRAY
Array.prototype.shuffle = function () {
for (var i = this.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var tmp = this[i];
    this[i] = this[j];
    this[j] = tmp;
}

return this;
}

Array.prototype.in_array = function (needle) {
    for(var i = 0; i < this.length; i++) {
       if(this[i] == needle)
           return true;
    }
    return false;
}
4

2 回答 2

1

出现您的问题:

  1. 因为您正在添加(可枚举)函数Array.prototype,然后在您枚举任何数组时都会出现这些函数。

  2. 因为您不应该使用for ... in枚举数组,而仅用于枚举对象键。

如果你知道你在 ES5 浏览器上运行,你可以安全地添加函数到Array.prototypeusing Object.defineProperty

Object.defineProperty(Array.prototype, 'shuffle', {
    value: function() {
        ...
    }
});

默认创建不可枚举的属性。

于 2013-05-19T12:25:09.733 回答
1

这是地图功能的样子。我从头顶写了这个,所以可能有错误。

function object_map(object, callback) {
    var key, ret = {};
    for (key in object) {
        if (Object.prototype.hasOwnProperty.call(object, key)) {
            ret[key] = callback(key, object[key]);
        }
    }
    return ret;
}
于 2013-05-19T12:08:24.527 回答