JavaScript: ошибка JSLint "Тело for in должно быть заключено в оператор if для фильтрации нежелательных свойств из прототипа"
Я использую инструмент JSLint, чтобы убедиться, что мой JavaScript "строгий".
Я получаю следующую ошибку, но не понимаю, как ее исправить:
The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype
Для следующего кода:
for (var i in keypairs) {
...
}
У любого есть идеи, как это исправить, чтобы JavaScript был "строгим" и не был помечен JSLint
5 ответов
Если keypairs
это массив, тогда вы должны действительно перебирать элементы вроде:
for(var i = 0; i < keypairs.length; i++) {
...
}
Если keypairs
является хэшем, то JSLint правильно рекомендует проверить, что вы работаете с соответствующим типом ключа (т. е. подтверждаете, что хеш - это ожидаемый тип)
так что-то вроде
for(var i in keypairs) {
if(keypairs.hasOwnProperty(i)) {
...
}
}
где if проверяет любые критерии, гарантирующие, что вы не обращаетесь к функции-прототипу и т. д.
Он хочет, чтобы вы использовали hasOwnProperty
,
for (var i in keypairs) {
if(keypairs.hasOwnProperty(i))
{
// Use i
}
}
Как и большая часть JSLint, это рекомендация, и ее применимость зависит от вашей ситуации. Это полезно, если в прототипе объекта есть нежелательные перечисляемые свойства. Это может иметь место, если вы, например, используете определенные библиотеки JavaScript.
Проблема с for...in
в том, что вы также пройдете через свойства прототипа, и в большинстве случаев это не то, что вам нужно. Вот почему вы должны проверить свойство с hasOwnProperty
:
for (var i in keypairs) {
if(keypairs.hasOwnProperty(i) {
//...
}
}
for (var i in keypairs) {
if (keypairs.hasOwnProperty(i)) {
...
}
}
Это потому что for
/in
цикл может перебирать какой-либо метод, расширенный сторонней библиотекой, например, если есть
Object.prototype.clone = function() { ... }
тогда без .hasOwnProperty()
состояние, .clone
Метод будет повторяться в ...
также.
Это дополнительно объясняется в http://yuiblog.com/blog/2006/09/26/for-in-intrigue/, связанном с самой страницей JSLint.
Вы можете отключить это предупреждение, установив флажок "Допускать нефильтрованный вход".
Взгляните на собственную документацию jslint: http://www.jslint.com/lint.html перейдите к разделу
для в
они делают следующее:for (name in object) { if (object.hasOwnProperty(name)) { .... } }