Как предотвратить преобразование значений в строки в javascript?

#javascript

#javascript

Вопрос:

     var str;
    var displayedNum;
    for (i in imgURLArray){
        str = "<li photonum=" i ">"   "<a>"  (1 i)   "</a>"   "</li>";
        $("ul.selection-list").append(str);

}
  

Мне нужно сделать это в цикле, но в результате выводится «11» вместо «2», потому что он преобразуется в строку перед добавлением.

У меня та же проблема, если я пытаюсь выполнить сложение вне строки и сохранить также в переменной, она все равно преобразуется в строку вместо выполнения сложения.

Число (1 1) по-прежнему сначала преобразуется в строку, прежде чем превращаться в число, поэтому получается 11.

Комментарии:

1. Это решит вашу проблему: ... 1 i ...

Ответ №1:

Используйте круглые скобки:

 var str = "foobar"   (1 i)   "other stuff";
  

У меня та же проблема, если я пытаюсь выполнить сложение вне строки и сохранить также в переменной, она все равно преобразуется в строку вместо выполнения сложения.

Этого не должно быть. Я предполагаю, что вы и там делаете что-то не так.

Обновление: Похоже, что вы преобразуете i в строку где-то в коде, который вы не публиковали.

Не используйте для перебора массива for..in Обновление 2:. Используйте обычный for цикл, если это действительно массив:

 for(var i = 0, l = imgURLArray.length; i < l; i  )
  

Но если это объекты:

for...in всегда будет задан i в виде строки (поскольку он перебирает свойства объекта, которые не всегда являются целыми числами). Это означает, что вам придется преобразовать, i прежде чем выполнять какое-либо добавление:

 ...   (1   ( i))   ...
  

Обновление 3:

Вам не всегда нужно использовать такой «явный» цикл for. Например, вы можете перемещаться по массиву в обратном порядке, что делает заголовок короче:

 for (var i = imgURLArray.length; i--; ) {
    str = "<li photonum=" i ">"   "<a>"  (1 i)   "</a>"   "</li>";
    $("ul.selection-list").prepend(str);
}
  

Комментарии:

1. @BenB.: Тогда, пожалуйста, опубликуйте больше вашего кода. Это работает: jsfiddle.net/fkling/XfDwd Я предполагаю, что вы где-то конвертируете i в строку.

2. for…in установит i в виде строки? Что в этом рационального??

3. @BenB.: for...in используется для перебора свойств объектов, таких как: obj = {foo: 'bar'}; for(var i in obj){console.log(obj[i]} . Очевидно, что foo не является целым числом.

4. @Ben Вы уверены, что свойства imgURLArray являются числами, а не строками?

5. Хорошо, хорошо прочитаем это на for…in . Думаю, с этого момента я никогда не буду это использовать… очень плохо… Я предпочитаю это явным циклам.

Ответ №2:

Попробуйте обернуть числа в Number()

Нравится:

 var i = 1;

var str = "foobar"   Number(1 i)   "other stuff";
  

Комментарии:

1. Пытается преобразовать параметры в виде чисел, а не складывать их вместе в виде строк.

2. @c-smile Number(x) приводит значение x к типу Number.

3. Нет. Сначала преобразуется в строку, поэтому она преобразуется в число после объединения «строки», например, Число (1 1) = 11

4. У меня все нормально работает? Мой вывод был: foobar2 other stuff

5. @Marty Wallace: если ‘i’ — это число, то результатом number number также является число. В чем тогда смысл Number(number) этого?

Ответ №3:

 var str = "foobar"   (1 i)   "other stuff";
  

Ответ №4:

Вы могли бы просто использовать метод parseInt:

 var str = "foobar"   (parseInt(1 i))   "other stuff";
  

Ответ №5:

Причина связана с вашим циклом:

 for (i in imgURLArray){
  

При этом выполняется итерация по всем именам свойств imgURLArray в виде строк. Итак, вам нужно будет использовать Number() для преобразования i в целое число:

     str = "<li photonum=" i ">"   "<a>"  (1 Number(i))   "</a>"   "</li>";