繁体   English   中英

数组中的javascript原型循环

[英]javascript prototype loop for in array

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

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

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

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

我在“PHP”或“蟒蛇”开发过,我爱“中”或“的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;
}

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

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

你的问题出现了:

  1. 因为你要向Array.prototype添加(可枚举的)函数,这些函数会在你枚举任何数组时出现。

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

如果您知道自己在ES5浏览器上运行,则可以使用Object.defineProperty安全地向Array.prototype添加函数:

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

默认为创建非可枚举属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM