Проблема расширить массив - PullRequest
3 голосов
/ 16 августа 2011

У меня проблема.Я написал код для расширенного элемента массива, и он отлично работает, но когда я перебираю массив, это показывает расширенные функции.Я не знаю, как это остановить.Есть код ...

Array.prototype.remove  = function(e)   {var i = this.inArray(e);if(i != -1) this.splice(i, 1);return this;};
Array.prototype.add     = function(e)   {this.push(e); return e;};
Array.prototype.inArray = function(v)   {for(i in this) if(v==this[i])return i;return false;};
Array.prototype.toggle  = function(v)   {this.inArray(v) ? this.remove(v) : this.add(v);return this;};

Так что, когда я попробовал это ...

var arr = [1,2,3,4,5];
for(i in arr)
document.write(arr[i]);

, значения и функции этого массива печати расширились.кто-нибудь может мне помочь?Я не могу изменить код "for (x in y)", потому что много раз во многих файлах.

Ответы [ 4 ]

2 голосов
/ 16 августа 2011

Несколько вещей для чтения, которые объяснят ситуацию

https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Используйте .forEach () при итерации по массиву.Он довольно хорошо поддерживается, включая Mobile Safari и Android, https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach

1 голос
/ 16 августа 2011

Если вам нужно изменить прототип Array, вы должны использовать hasOwnProperty(), иначе он подберет свойства в цепочке прототипов.

var arr = [1,2,3,4,5];
for(var i in arr) {
    if (arr.hasOwnProperty(i)) {
        document.write(arr[i])
    }
}

Однако вы сказали,Вы не хотите менять свои for (in) петли.Почему у вас нет служебного объекта Array?Или просто использовать нормальные for петли?Это Array с верно?for (in) предназначен для итерации по Object свойствам.

0 голосов
/ 16 августа 2011

Итерация по индексам массива .-

var A=[1,2,3,4,5];

Array.peototype.omega=function(replacer){
  var L= this.length;
  if(L)--L;
  if(replacer!=undefined)this[L]=replacer;
  return this[L]
}

for(var i=0,L=A.length; i<L; i++){
//do something to A[i]
}
0 голосов
/ 16 августа 2011

for ... in перебирает свойства объекта в JavaScript, а не элементы массива . Циклы for ... in - просто неправильный способ сделать это. Вы сказали, что не можете их изменить, но использование этого синтаксиса для перечисления содержимого массивов не рекомендуется в JavaScript по той причине, которую вы только что обнаружили.

Рано или поздно вам придется переписать петли for ... in.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...