Как работает for(var x в объекте), если изначально в объекте изначально нет переменной x?

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть объект, и я пытаюсь увидеть, что внутри него. Итак, я использовал print(object) , который, возможно, должен содержать Spot: True , указывающий, что cat Spot является живым. Он вернулся [object object] . Итак, я попробовал, show(object) , и у меня получилось Spot: True . Я думаю, что это правильно, но я не уверен, на что похожи индексы. Например, я не уверен, являются ли ключи ассоциативными или числовыми, или даже разрешены ли ассоциативные массивы в JavaScipt.

Причина, по которой я задаюсь вопросом, почему, потому for (var cats in object){show(cats);} что возвращает Spot . Я не могу найти способ найти строку ‘cat’ как часть массива.

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

1. cats является переменной, как x и в: var x = 42; . Кстати, show это не встроенная функция JavaScript.

2. Феликс, вот почему я хотел бы, чтобы они включили код, который заставляет show работать…. Я знаю, что cats — это переменная. Это очевидно. Что не очевидно, так это то, почему программа перечисляет все «cats» в объекте, когда в объекте нет ничего «cats».

Ответ №1:

cats В вашем примере это новая переменная, которая содержит каждый объект итерации.

И да, «ассоциативные массивы» разрешены, но на самом деле это просто объекты:

 var foo = {
    bar: "baz"
}
alert(foo.bar);
alert(foo["bar"]);
  

Re: for/in утверждение: оно более или менее совпадает со следующим, здесь используется массив:

 var cats;
var arr = [42, 69];
for (var i = 0; i < arr.length; i  ) {
    cats = arr[i];
    alert(cats);
}
  

Или вы можете использовать for/in , и это становится:

 for (cats in arr) {
    alert(arr[cats]);
}
  

Это немного отличается для массивов, но в массиве также нет «кошек».

Скрипка

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

1. Дэйв, похоже, ты ближе всего к ответу, который я могу понять. Не могли бы вы посмотреть ветку ответа на вопрос?

2. @Wolfpack’08 Имена переменных произвольны; возможно, «Spot» — это имя кошки автора? Я не могу сказать, почему было выбрано это имя, но это не имеет никакого отношения к содержимому массива с технической точки зрения. С когнитивной точки зрения это должно, чтобы упростить чтение и понимание кода.

3. Дэйв, я понимаю, почему Spot находится в объекте. Есть строка кода : var livingCats = {Spot: "True"}; . Я не понимаю, почему var cats перечисляет массив, потому что он не существует как ключ или значение в объекте.

4. @Wolfpack’08 … Именно так работает JavaScript. Когда вы говорите for (anyVariable in anObject) , значение anyVariable устанавливается для каждого свойства этого объекта, поскольку свойства объекта повторяются. Переменная cats не «перечисляет массив», for оператор перечисляет массив и устанавливает значение cats для каждой записи массива во время перечисления. Я отредактирую ответ, чтобы посмотреть, смогу ли я сделать его более понятным, но больше ничего нельзя сказать.

5. @Wolfpack’08 (И если ответ отвечает на ваш вопрос, он должен быть принят.)

Ответ №2:

В Javascript есть массивы и объекты. Массивы имеют числовые непрерывные индексы [0..length) и упорядочены, в то время как объекты могут иметь случайные индексы (строки, числа) и не обязательно упорядочены (зависит от реализации).

Использование for(var key in obj) {} должно использоваться только для объектов и выполнять итерации по свойствам, которые имеет объект. Вы можете использовать obj[var] для доступа к значению каждого свойства. Обратите внимание, что полезно добавить if(!obj.hasOwnProperty(key)) continue; проверку в цикл, чтобы убедиться, что вы не попали в свойства, введенные в прототипе объекта.

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

1. Я думаю, что в моем случае show(object); дает мне формат возврата {index: value} . Хотелось бы, чтобы автор книги показал нам, как работает исходный код для показа. Я думаю, просто набрав «объект», вы получите пару индекс-значение в консоли.

Ответ №3:

Если object это ваш объект, я предполагаю, что на самом деле это не массив. Также for (var x in object) может быть перечисление элементов (свойств, функций и т. Д.) Вашего объекта.

Откуда вы object пришли? Что такое show() и print() ?

Если бы я пытался распечатать свойства объекта, у меня могло бы быть что-то вроде этого:

 var myObject = {
    property1: 'Test',
    property2: 'Test2',
    function1: function() {
        // do something
    }
};

for (var prop in myObject) {
    if (myObject.hasOwnProperty(prop)) {
        console.log(prop   ' = '   myObject[prop]);
    }
}
  

Это должно привести к следующему:

 property1 = Test
property2 = Test2
function1 = function() { // do something }
  

Вот jsFiddle, чтобы показать пример.

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