2013-03-20 3 views
0

Я пишу на JavaScript и обнаружил это странное поведение, которое я не могу объяснить.для индекса цикла, который преобразуется в строку без причины

for (i in bubbles){ 

bubbles[i].string = "some stuff!" // <- no errors here 

results[0] = i - 1 
results[1] = i + 1 
results[2] = parseInt(i) + 1 


} 

когда i = 1 это происходит

results[0] -> 0 
results[1] -> 11 
results[2] -> 2 

это вообще возможно ?! Возможно, это связано с другими ошибками в коде. Я попытался выделить случай выше, но, если вам это нужно, вот весь код

for (i in bubbles){ 

      if (bubbles[i].check()){ 

       // define which boubble has been clicked and start dragging 
       bubbleDrag[2] = bubbles[i].check(); 
       bubbleDrag[1] = i; 
       bubbleDrag[0] = true; 

       // define where to check to avoid overlapping dates 
       if (i != 0 && i < bubbles.length - 1){ 

        bubbleDrag[3] = i - 1; 
        bubbleDrag[4] = i + 1; 

       } else if (i == 0 && bubbles.lenght > 1){ 

        bubbleDrag[3] = i + 1; 

       } else if (i == bubbles.lenght - 1){ 

        bubbleDrag[3] = i - 1; 

       } 

      } 

     } 
+3

Что такое 'пузыри'? Цикл 'for -in' в JavaScript предназначен для итерации над _objects_' {} ', а не над _arrays_' [] '. Переменная iterator всегда будет строкой. –

+7

В цикле 'for ... in' переменная цикла всегда является строкой, потому что вы выполняете итерацию поверх * свойств объекта *. Если вы выполняете итерацию по массиву, используйте обычный цикл 'for'. См. Https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in#Description и http://stackoverflow.com/q/2265167/218196. –

+0

bubbles - массив объектов ... – Saturnix

ответ

1

Javascript интерпретирует код.

results[0] = i - 1 
// string minus number, so javascript "assumes" you want "i" as a number 

results[1] = i + 1 
// string concatenate with a number, so javascript assumes you want a concatenated string 

Другие примеры.

"30" - 10; // echoes number 20 
"30" + 10; // echoes string "3010" 

Некоторые люди, подобные языкам, интерпретируют это так, некоторые нет. Я оказался в последнем. IMO, строка + номер должен выдать ошибку, поскольку намерения не явны. Свободные/нестрогие интерпретации могут привести к неожиданным результатам. Если вы прочтете код Дугласа Крокфорда, вы заметите, что он использует широкомасштабное сравнение типов (===,! ==), и это является частью причины.

+0

переключился на цикл, теперь работает отлично! Благодаря! – Saturnix

Смежные вопросы