Задать вопрос
usdglander
@usdglander
Yipee-ki-yay

Имеет ли смысл такая конструкция в JS?

Добрый день!
Я сам бэкенд разработчик, поэтому JS знаю весьма поверхностно. В проекте над котором я работаю часто в js-коде встречаю конструкцию вида:
for (var i in result) {
    if (result.hasOwnProperty(i)) {
        //Остальной код
    }
}

Насколько я понимаю, в данном случае for перебирает именно свойства объекта, поэтому result.hasOwnProperty(i) не может быть false. Во всяком случае я не придумал подходящего "кейса".
Правильно ли я думаю, что if, в данном случае избыточен или нет?
Заранее спасибо за ответы!
  • Вопрос задан
  • 155 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 3
Xuxicheta
@Xuxicheta
инженер
Цикл for..in перебирает свойства объекта и всех его прототипов. Чтобы исключить свойства прототипов из цикла используется проверка hasOwnProperty.
Сейчас это считается устаревшим, в моде перебор объекта через Object.keys/Object.values/Object.enties с помощью for..of или перебирающих методов Array.

т.е. нынче конструкция
for (var i in result) {
    if (result.hasOwnProperty(i)) {
        //Остальной код
    }
}

должна выглядеть так
Object.keys(result).forEach((i) => {
  //Остальной код
});
Ответ написан
Комментировать
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
result.hasOwnProperty(i) не может быть false. Во всяком случае я не придумал подходящего "кейса".

Может быть и false, если какое-то свойство определено в прототипе:
class Test {
    constructor() {
        this.foo = 'foo';
    }
};

Test.prototype.bar = 'bar';

const test = new Test();

console.log('foo' in test); // true
console.log('bar' in test); // true
console.log(test.hasOwnProperty('foo')); // true
console.log(test.hasOwnProperty('bar')); // false
Ответ написан
Комментировать
@McBernar
К объекту через прототипы может быть прикручено какое-то общее свойство, которое в данном контексте не нужно. Поэтому тут и проверяются свойства именно этого конкретного объекта без беготни по цепочке прототипов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы