我正在开发一个使用大量“javascript”的项目。 我有很多“ajax”调用,它总是返回“json”数组。 由于有用的原因,我创建了两个Array对象的原型(“in_array”函数和“shuffle”函数)。
由于我做了原型,我的所有“for in”循环都被打破了(两次显示“未定义”......) 我查看了谷歌和stackoverflow,现在我知道我的错误。 当然,如果我删除我的原型,“undefined”就会消失。
但是,我找不到所有答案。
首先,我看到很多次,使用“for in”循环是不好的,为什么?
我也在“PHP”或“python”中开发,我 DO 喜欢“in 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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您的问题出现了:
因为您正在向Array.prototype
添加(可枚举)函数,这些函数会在您枚举任何数组时出现。
因为您不应使用for ... in
枚举数组,仅用于枚举对象键。
如果您知道自己在ES5浏览器上运行,则可以使用Array.prototype
安全地向Object.defineProperty
添加功能:
Object.defineProperty(Array.prototype, 'shuffle', {
value: function() {
...
}
});
默认为创建不可枚举的属性。