Переменная для цикла - это строка
Я не уверен, что это нормальное поведение, но выполняется это:
for (var i in [1, 2, 3]) {
console.log(i + 1);
}
Результаты в этом:
// 01
// 11
// 21
Может кто-нибудь объяснить, почему var i
обрабатывается как строка в этой ситуации, а не если я делаю for (var i = 0; i < [1, 2, 3].length; i++)
?
Ответы
Ответ 1
Скорее всего, потому что в этом для стиля цикла (for..in) он обрабатывает i
как ключ, а так как ключи в объектах обычно являются строками (да, массив - это тип объекта в javascript), он рассматривает его как строку.
parseInt(i)
работает в этой ситуации, но для хорошей практики программирования вы хотели бы использовать цикл for
, который выглядит примерно так:
var array = [1, 2, 3];
for (var i = array.length - 1; i >= 0; i--) {
// do work with each array element here
}
Ответ 2
Причина в том, что for .. in
выполняет итерацию свойств объекта ( "ключи" ), даже для массивов. "Ключами" в этом случае являются "индексы" массива, но они все еще являются объектными ключами. Поскольку все ключи объектов являются строками, i
получает строковое значение.
Ответ 3
Я думаю, что вам нужны значения массива, а не ключи. Если вы не можете использовать ES6, Xorifelse answer работает, но если возможно, есть for ... of
, который работает точно так, как вы, вероятно, подумали:
for (let i of [1, 2, 3]) {
console.log(i + 1);
}
Ответ 4
Используя ключевое слово in
, вы перебираете каждую клавишу в объекте, и это типы строк, а при использовании оператора +
в строке это приведет к назначению конкатенации.
Если вы хотите выполнить присвоение арифметического, то левое и правое значение оператора должны быть целыми. Решением было бы попытаться проанализировать строку на целое число:
console.log(parseInt("0") + 1); // 1
Однако.... Вместо этого вы должны перебирать значение:
var data = [1, 2, 3];
for(var key in data){
console.log('a: data['+ key + '] = ' + data[key]);
}
for (var i = 0; i < data.length; i++) {
console.log('b: data['+ i + '] = ' + data[i]);
}
data.forEach(function(value, index){
console.log('c: data[' + index + '] = ' + value);
});
Ответ 5
Это потому, что i
является ключом/индексом для каждого элемента и является строковым типом.
Таким образом, вы на самом деле объединяете строку и int - результатом является строка.
Ответ 6
Это потому, что с ключевым словом "in" вы перемещаете ключи объекта, а не индексы массива. Однако в этом случае, поскольку объектом является массив, ключи элементов являются индексами. И, наконец, ключи в цикле for..in представляют собой строки.
Итак, если вам нужны числовые индексы массива, вам нужно использовать регулярный цикл.
var array = [0, 1, 2];
for (var i = 0; i < array.length; i++) {
console.log(i + 1);
}
Ответ 7
Хорошо, когда вы используете цикл for...in
, вы посещаете каждый ключ от объекта. Массивы - это объекты, а их ключи - числа, но обычно объектные ключи обрабатываются как строки.
Если вы хотите преобразовать ключ в int, вы можете использовать функцию parseInt
.
ссылка!
Ответ 8
for (var i in [1, 2, 3]) {
console.log(parseInt(i) + parseInt(1));
}