Почему «current in mailArchive» должно быть условием закрытия? - PullRequest
0 голосов
/ 16 октября 2011

код выглядит следующим образом

var mailArchive = {0: "Dear nephew, ... (mail number 1)",
                   1: "(mail number 2)",
                   2: "(mail number 3)"};

for (var current = 0; current in mailArchive; current++)
  print("Processing e-mail #", current, ": ", mailArchive[current]);

Я бы подумал, что current < mailArchive.length будет лучшим условием закрытия ...

Достигает ли current in mailArchive того же, что и в интерпретаторе (необходим для функции печати)? Если нет, что это делает и как?

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Что вы подразумеваете под "current < mailArchive.length было бы лучшим условием закрытия"? Кроме того, функция print здесь на самом деле ничего не требует. Он просто получает current и значение mailArchive[current] в качестве параметров. Это также не закрытие, просто примечание.

Несмотря на это, автор «Красноречивого JavaScript» только пытается показать, что вместо использования Objects таким неуклюжим образом, существует встроенная конструкция - Array. Который вы пройдете , используя current < mailArchive.length.

Что касается того, что он выполняет - in - это оператор, который проверяет, принадлежит ли свойство (в данном случае значение current) объекту (mailArchive здесь). Поскольку свойства называются так же, как индексы («0», «1» и т. Д.), Их намерения очень похожи на обычные

for (var current = 0; current < mailArchive.length; current++)

петля.

Однако есть несколько проблем с этим. Оператор in ищет свойства не только самого объекта, но и всей цепочки его прототипов. Это означает, что если бы для этого объекта mailArchive был определен прототип, оператор in также проанализировал бы свойства прототипа. Обычно это не то, что вы хотите в своих циклах.

Есть способы преодолеть это. Обычно метод hasOwnProperty (определенный для объекта) используется для различения свойств, принадлежащих самому объекту.

Указанный выше цикл for можно переписать так:

for (var current in mailArchive)
{
   if( mailArchive.hasOwnProperty(current) )
   {
       print("Processing e-mail #", current, ": ", mailArchive[current]);
   }
}

но это считается чем-то плохим.

1 голос
/ 16 октября 2011

Да, он работает в интерпретаторе, я протестировал его с node.js интерактивным сеансом. mailArchive.length, однако, не будет работать, поскольку mailArchive - это Объект, а не Массив, поэтому не имеет свойства с именем length.

current in mailArchive проверяет, есть ли у объекта mailArchive свойство с именем, данным в переменной current.

Как вы можете знать или не знать, однако, этот подход не является обычным для JavaScript. Гораздо более распространенным является вместо этого mailArchive массив и использование обычного условия current < mailArchive.length

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