Javascript для цикла () с объявлением объекта и зарезервированным словом IN - просто ищу пояснения - PullRequest
0 голосов
/ 28 августа 2011

Я работаю над базовым сценарием обучения ниже.Мой главный вопрос в объявлении for (), что такое зарезервированное слово IN и как оно относится к starName, потому что оно ранее нигде не определено на странице.

Я пытаюсь понять, какцикл for () «думает» с этим starName в выражении star .

<script type="text/javascript">
var star = {};

star["Polaris"] = new Object;
star["Mizar"] = new Object;
star["Aldebaran"] = new Object;
star["Rigel"] = new Object;

star["Polaris"].constellation = "Ursa Minor";
star["Mizar"].constellation = "Ursa Major";
star["Aldebaran"].constellation = "Taurus";
star["Rigel"].constellation = "Orion";

</script>
</head>
<body id="mainbody">

<script type="text/javascript">
for (starName in star) {
var para = document.createElement('p');
para.id = starName;
para.appendChild(document.createTextNode(starName +
": " + star[starName].constellation));
document.getElementsByTagName("body")[0].appendChild(para);
}
</script>

<!-- output below -->

<p id="Polaris">Polaris: Ursa Minor</p>
<p id="Mizar">Mizar: Ursa Major</p>
<p id="Aldebaran">Aldebaran: Taurus</p>
<p id="Rigel">Rigel: Orion</p>

Ответы [ 4 ]

3 голосов
/ 28 августа 2011

Синтаксис for ... in перечисляет все перечислимые свойства объекта.

starName будет строкой, представляющей имя свойства.Вы можете получить доступ к этому свойству (и делать много других вещей) следующим образом:

var p = star[starName];

Теперь есть пара вещей, о которых вы должны знать при использовании синтаксиса for ... in:

Используйте hasOwnProperty для защиты от свойств, добавленных выше в цепочке прототипов.

Object.prototype.allObjectWillInheritThis = 1;

/// ...

for (var starName in star) {
    if (star.hasOwnProperty(starName)) {

        // Do your thing
    }
}

Отфильтруйте функции.Скорее всего, вас интересует не функция, а свойства.

for (var starName in star) {
    if (star.hasOwnProperty(starName) &&
        typeof star[starName] !== 'function') {

        // Do your thing
    }
}
1 голос
/ 28 августа 2011

Как это работает, является ли звезда массивом (или объектом) с несколькими значениями.Представьте себе массив с номерами от 1 до 10.

Ключевое слово in просматривает массив и присваивает значение starName.Таким образом, массив с номерами от 1 до 10 будет повторяться 10 раз, и каждый раз starName станет следующим значением.

Порядок основан на индексе массива (или объекта)

1 голос
/ 28 августа 2011

Может быть, это поможет: for(newVariable in existingVariable);

Конструкция for-loop создает новую переменную, которую вы можете использовать в качестве текущего значения в вашем цикле. Второе значение - это переменная, которую вы хотите зациклить.

Как указал Брайан, конструкция for-in работает только с перечислимыми свойствами. Если вы хотите проверить, является ли что-то перечислимым, вы можете позвонить .propertyIsEnumerable(0) на него.

0 голосов
/ 28 августа 2011

Эта конструкция

for(var key in collection) { ... }

позволяет перебирать перечисляемые ключи в коллекциях JS (объекты / карты и массивы).На каждой итерации key будет получать новое значение ключа, содержащееся в коллекции.

Примечание # 1: for(...in...) имеет «классную» возможность итерации не только с помощью ключей, определенных на самих объектах, но и в их прототипах,

Примечание # 2: ключевая переменная должна иметь ключевое слово 'var' перед ним, чтобы этот цикл работал эффективно.Без 'var' переменная 'key' будет создана в глобальном пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...