Иметь массив JS без ключей

Код 1

var psnb_arr=['14-007', '14-008', '14-009'];
console.log(psnb_arr);

//output in firebug: ["14-007", "14-008", "14-009"]

Код 2

for (var i in psnb_arr) {
  var psnb=psnb_arr[i];
  console.log(i+'-'+psnb);
}

//wierd output in firebug:
0-14-007
1-14-008
2-14-009

copy-function (start,length){start=start||0;if(start<0)start=this.length+start;

length=length||(this.length-start);var newArray=[];for(var i=0;i<length;i++)newArray[i]=this[start++];return newArray;}

remove-function (item){var i=0;var len=this.length;while(i<len){if(this[i]===item){this.splice(i,1);len--;}else{i++;}} return this;}

contains-function (item,from){return this.indexOf(item,from)!=-1;}


...

Что это за странный вывод в firebug для console.log внутри цикла? Я имею в виду текст, идущий сразу после «2-14-009» - «функция копирования ...»

0
ihtus 15 Фев 2014 в 00:58
3
Что так навязано об этом, его грядущий правильный вывод.
 – 
Suman Bogati
15 Фев 2014 в 01:00
I = "0-" на первом выходе, как это написано в вашем коде.
 – 
Diodeus - James MacFarlane
15 Фев 2014 в 01:00
Ваш «объект без ключей» - это просто массив. У него есть ключи, они числовые.
 – 
Rocket Hazmat
15 Фев 2014 в 01:01
Я имею в виду текст, идущий сразу после «2-14-009» - «функция копирования ...»
 – 
ihtus
15 Фев 2014 в 01:01
Можете ли вы сделать скрипку, чтобы воспроизвести вашу проблему? У вас нет этого в другом браузере? Я просто получаю вывод массива, а не все остальное. Какую версию Firefox / firebug вы используете?
 – 
putvande
15 Фев 2014 в 01:02

1 ответ

Лучший ответ

У вас нет ни объекта, ни ассоциативного массива (их нет в JavaScript). Что у вас есть в "обычном" (числовом) массиве. У него есть ключи; индексы массива (откуда берутся 0- и т. д.).

Проблема, которую вы видите, заключается в том, что вы используете for...in в массиве. Это плохая практика. Прототип Array может содержать свойства (иногда библиотеки JavaScript добавляют их), поэтому вы перебираете все из этих свойств, а не только значения массива.

Вы хотите использовать здесь обычный цикл for.

for(var i = 0; i < psnb_arr.length; i++){
    var psnb=psnb_arr[i];
    console.log(i+'-'+psnb);
}
2
Rocket Hazmat 15 Фев 2014 в 01:09
@putvande: Да, я в курсе. Я объяснил точно , почему это происходит и как это исправить. В чем проблема?
 – 
Rocket Hazmat
15 Фев 2014 в 01:11
Спасибо, я не знал о том, что "иногда библиотеки JavaScript добавляют их"
 – 
ihtus
15 Фев 2014 в 01:12
@ihtus: вы используете что-то вроде Prototype или прокладка ES5? Обычно это происходит отсюда. Они добавляют методы в Array.prototype.
 – 
Rocket Hazmat
15 Фев 2014 в 01:13
В качестве другого варианта hasOwnProperty может исправить проблему выше, но в любом случае объяснение @RocketHazmat в порядке
 – 
Eugene P.
15 Фев 2014 в 01:13
@EugeneP: Да, вы можете добавить hasOwnProperty в цикл for..in, но проще (и я думаю, что это лучше) просто использовать обычный цикл for (или .forEach() ). :-)
 – 
Rocket Hazmat
15 Фев 2014 в 01:15