Почему в приведенном ниже коде индекс массива представляет собой строку?

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
for(var index in arrayOfNumbers){
   console.info(index+1);
}

Результатом этого примера кода является
. 01
11
21
31
41
51
61

Почему эти индексы массива обрабатываются в JavaScript как строка?

Потому что это строка. Попробуйте typeof index, он вернет тип "string"

Deepak Kamat 13.03.2018 08:11

ключи объектов всегда являются строками.

Nina Scholz 13.03.2018 08:11

если вы хотите добавить индекс с 1, вы можете попробовать этот console.info (parseInt (index) +1); согласен с @NinaScholz

sachin 13.03.2018 08:12

Классический объект имеет свойства {'foo': 'hello'}, массив ['hello'] в основном такой же, как {'0': 'hello'}. Массивы - это просто объекты, имена свойств которых являются индексами, но в конечном итоге они заканчиваются строкой.

sjahan 13.03.2018 08:12

Да, и for..in изначально предназначены для объекта, поэтому разумно возвращать строку, поскольку ключи объектов всегда являются строками.

Deepak Kamat 13.03.2018 08:12

@rohitwtbs Я опубликовал ответ, который может дать вам ожидаемый результат.

SINGH 13.03.2018 08:17

Индекс - это не строка, а index + 1. Переведите индекс в int, и все будет в порядке

patrick 13.03.2018 08:18

Кстати, следует избегать использования цикла for...in с массивами. См. Этот Почта.

Mohammad Usman 13.03.2018 08:33

@DeepakKamat Не только изначально. Они все еще есть :-)

Bergi 22.03.2018 03:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
9
137
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

От MDN для ... в

Note: for...in should not be used to iterate over an Array where the index order is important.

... The for...in loop statement will return all enumerable properties, including those with non–integer names and those that are inherited.

При использовании для ... в ключ всегда является строкой, и все, что он делает, - это конкатенация строк.

У вас есть массив, поэтому лучше использовать Array.foreach () так:

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
arrayOfNumbers.forEach(function(item, index){
     console.info(index + 1); // Here the index is a number!
});

И это потому, что ключи объекта всегда являются строками, независимо от того, { 0: "some value" } это или '0': "value value..".

Deepak Kamat 13.03.2018 08:14

да, я проверил с typeof, и это строка. Мой запрос похож на другие языки, такие как JAVA, это будет целое число, но почему этот индекс является строкой в ​​javascript?

rohitwtbs 13.03.2018 08:14

@rohitwtbs, потому что при использовании for in он обрабатывает ваш массив как объект, а ключи объекта всегда являются строками.

caramba 13.03.2018 08:17

@caramba понял.

rohitwtbs 13.03.2018 08:19

Ключ - это строка, потому что это объект. В JavaScript есть Объект, поэтому его ключи в строке.

Вы можете добиться этого, преобразовав строку в int или добавив префикс +.

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
for(var index in arrayOfNumbers) {
  var v = parseInt(index) + 1;
  console.info(v);
}

С префиксом

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
for(var index in arrayOfNumbers) {
  var v = parseInt(index) + 1;
  console.info(v);
}
 var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
 for(var index in arrayOfNumbers){
    var v = +index + 1;
     console.info(v);
  }

Не используйте "for in" для массива. 'for in' предназначен для обхода объекта. Когда вы пробуете это с массивом, это выглядит так:

arr = {
    "0": 1,
    "1": 2,
    "2": 3,
    "3": 4,
    "4": 5,
    "5": 6,
    "6": 78
}

Надеюсь, вы это ищете:

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
for(var index=0; index<arrayOfNumbers.length; index++) {
     console.info(index+1);
}

Ссылка: MDN FOR..IN

Оператор для ... в выполняет итерацию по перечислимым свойствам объекта. Для каждого отдельного свойства могут выполняться операторы.

var string1 = "";
var object1 = {a: 1, b: 2, c: 3};

for (var property1 in object1) {
  string1 = string1 + object1[property1];
}

console.info(string1);

В вашем случае индексы называются ключами объектов, которые представляют собой строку t или строку ключа: { foo : 'something in universe'}

Посмотрите здесь, если вам нужно значение ключа:

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
for(var index in arrayOfNumbers) {
    console.info(arrayOfNumbers[index+1]);
}
console.info(arrayOfNumbers)

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

Однако для желаемого результата вы можете использовать что-то вроде этого:

var arrayOfNumbers = [1, 2, 3, 4, 5, 6, 78];
arrayOfNumbers.forEach(function(num)
{
    console.info(num+1);
});

От для ... в (MDN):

The for...in statement iterates over the enumerable properties of an object.

Таким образом, значение index в вашем коде всегда будет возвращать имена этих свойств. В массиве это имена индексов.

Кроме того, String плюс Number равняется String, который напечатан в console.

Другие вопросы по теме