Проверка существования свойства объекта в JavaScript

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

Далее приведены все из них с примерами, так что давайте начнём.

1. Оператор in

Оператор in возвращает true, если указанное свойство присутствует внутри объекта или в цепочке его прототипов. Оператор in работает и для объектов, созданных статическим методом Object.create().

const person = {
name: 'John',
surname: 'Doe',
age: 41
};

const hasLocation = 'location' in person;
if (hasLocation) {
console.log("We have the location data");
} else {
console.log("We don't have the location data")
}

// Результат:
// We don't have the location data

const user = Object.create({ name: 'Donald' });
console.log('name' in user); // true

2. Метод Object.prototype.hasOwnProperty()

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

Хотя функция Object.prototype.hasOwnProperty() уже давно присутствует в спецификации JavaScript, она имеет ряд недостатков. hasOwnProperty() не работает для объектов, созданных с помощью Object.create(null), поскольку они не наследуются от Object.prototype, что делает hasOwnProperty() недоступной для созданного объекта. При использовании hasOwnProperty() объект выбросит исключение.

const person = {
name: 'John',
surname: 'Doe',
age: 41
};

const hasName = person.hasOwnProperty('name');
if (hasName) {
console.log(`We have name property, value ${person.name}`);
} else {
console.log("We don't have name property");
}
// Результат:
// We have name property, value John

const user = Object.create({ name: 'Paul' });
console.log(user.hasOwnProperty('name')); // false

3. Метод Object.hasOwn()

В рамках версии ECMAScript 2022 в классе Object появился статический метод hasOwn(). Метод Object.hasOwn() рекомендуется использовать вместо hasOwnProperty() в тех браузерах, где он поддерживается. Object.hasOwn() является альтернативой методу Object.prototype.hasOwnProperty().

const person = {
name: 'John',
surname: 'Doe',
age: 41
};
const hasAge = Object.hasOwn(person, 'age');
if (hasAge) {
console.log(`We have age property, value ${person.age}`);
} else {
console.log("We don't have age property");
}

// Результат:
// We have age property, value 41

const user = Object.create({ name: 'Jorge' });
console.log(Object.hasOwn(person, 'name')); // true

4. Проверка на неопределённое значение

Когда мы пытаемся обратиться к несуществующему свойству объекта, то в результате получаем неопределённое значение. Поэтому мы можем использовать подход и делать что-то только тогда, когда значение свойства не является неопределённым.

const person = {
name: 'John',
surname: 'Doe',
age: 41
};
if (person.location !== undefined) {
// выполнить какую-то операцию
} else {
console.log('Location property is not present on person object');
}

5. Методы Object.keys() и Array.prototype.some()

В данном подходе используются методы Object.keys() и Array.prototype.some().

По сути, мы преобразуем объект в массив свойств, а затем у нас есть некий метод с предикатной функцией, в котором мы проверяем наличие имени целевого свойства. Этот метод имеет тот же недостаток, что и Object.prototype.hasOwnProperty(), поскольку мы не можем найти свойство объекта, если объект создан с помощью метода Object.create().

const person = {
name: 'John',
surname: 'Doe',
age: 41
};

const hasSurname = Object.keys(person).some(key => key === 'surname');
console.log(hasSurname); // true

const user = Object.create({ name: 'Thomas' });
const hasName = Object.keys(user).some(property => property === 'name');
console.log(hasName); // false

6. Пользовательская утилитарная функция JavaScript

Эта функция hasKey() принимает аргументы имени объекта и имени целевого свойства, и если оба аргумента определены, то мы выполняем цикл for-in по объекту и внутри каждой итерации проверяем, равен ли текущий ключ свойства целевому (входной параметр).

const person = {
name: 'John',
surname: 'Doe',
age: 41
};

const user = Object.create({ name: 'Kevin' });

function hasKey(object, target) {
if (object && target) {
for (const key in object) {
if (key === target) {
return true;
}
}
return false;
} else {
return false;
}
}

console.log(hasKey(person, 'name')); // true
console.log(hasKey(person, 'location')); // false
console.log(hasKey(user, 'name')); // true

Заключение

В целом, владение объектами JavaScript необходимо для веб-разработки.

Как видите, у нас есть множество вариантов, когда необходимо проверить наличие свойства внутри конкретного объекта JavaScript. По моему опыту, оператор in и метод Object.hasOwn() — это те методы, которых мы должны придерживаться в повседневной работе. Также, если у нас по каким-то причинам нет версии ECMAScript 2022, мы можем использовать оператор in или проверку на неопределённое значение.

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.4: Утилиты имперсонации

Следующая Статья

Новое в Symfony 6.4: Контексты сериализатора на основе классов