Подтвердить что ты не робот

Переменная для цикла - это строка

Я не уверен, что это нормальное поведение, но выполняется это:

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++)?

4b9b3361

Ответ 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));
}