JavaScript - беспорядок в массиве Google Chrome, созданный из .split () - PullRequest
4 голосов
/ 26 мая 2010

Учитывая следующую строку:

var str = "one,two,three";

Если я разделяю строку на запятые, я обычно получаю массив, как и ожидалось:

var arr = str.split(/\s*,\s*/);

Проблема в том, что в Google Chrome (для Mac) он добавляет дополнительные свойства в массив.

Вывод из отладчика Chrome:

arr: Array
    0: one
    1: two
    2: three
    constructor: function Array()
    index: undefined
    input: undefined
    length: 3

Так что, если я перебираю массив с циклом for/in, он перебирает новые свойства. В частности, свойства input и index. Использование hasOwnProperty, похоже, не помогает.

Исправить можно было бы сделать цикл for, основанный на длине массива. Тем не менее, мне интересно, кто-нибудь знает, почему Chrome ведет себя так. Firefox и Safari не имеют этой проблемы.

Ответы [ 5 ]

11 голосов
/ 26 мая 2010

Не перебирайте массивы, используя циклы for...in !! Это одна из многих ловушек Javascript ( plug ) - for...in циклы предназначены только для перебора свойств объекта.

Вместо этого используйте обычный цикл.

for (var i=0, max = arr.length; i < max; i++) { ... } 

<ч /> Механизмы Firefox и Safari ECMAScript / Javascript делают эти конкретные свойства не перечисляемыми (атрибут {DontEnum}), поэтому они не будут повторяться в цикле for...in. Тем не менее, циклы for...in не были предназначены для итерации по индексам массива.

3 голосов
/ 26 мая 2010

For..in для перебора перечислимых свойств объектов. Для массива, чтобы перебрать его индикаторы, просто используйте стандартный цикл for

for ( var i = 0, l = arr.length, i < l; i++ )
{
  // do whatever with arr[i];
}
2 голосов
/ 26 мая 2010

Не имеет непосредственного отношения к этой конкретной проблеме, но обратите внимание, что разбиение строк с помощью регулярных выражений имеет всевозможные проблемы, связанные с браузером. См. http://blog.stevenlevithan.com/archives/cross-browser-split для получения дополнительной информации и решений.

1 голос
/ 26 мая 2010

Итерации по массиву с циклом for / in, как правило, не рекомендуется. Прежде всего, порядок итерации не гарантируется, и, кроме того, вы рискуете такими проблемами, как та, что у вас возникла. Вам лучше использовать традиционный цикл for.

0 голосов
/ 08 октября 2011

Я предполагаю, что использование здесь регулярного выражения приводит к объекту, похожему на массив, во многом как результат выполнения RegExp.exec () .

Я не смог воспроизвести ошибку на Chrome / Win7, но я предлагаю использовать магию Array.prototype.slice.call(arr). Он известен тем, что отлично превращает подобные массивы в реальные массивы.

...