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

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

  • не определено

undefined - примитивный тип данных. Мы использовали его как значение объявленной переменной. Фактически, когда мы объявляем переменную (не инициализируем ее), она автоматически присваивает значение undefined.

let foo;
foo; // undefined

Итак, как undefined относится к ключевому существованию объекта. Давайте посмотрим на пример.

let obj = {fname:'john'}; 
obj.fname; // john
obj.lname; // undefined

В приведенном выше примере при доступе к свойству lname он печатает undefined. Это означает, что когда вы обращаетесь к несуществующему свойству, он печатает undefined. Теперь мы можем использовать undefined, чтобы проверить, существует ли свойство.

let obj = {};
if(obj.lname === undefined){
    // statement
}

Но это не всегда тот случай, когда вы используете undefined для существования свойства. Что, если кто-то использует undefined в качестве значения свойства.

let obj = {fname:'john', lname:undefined};
if(obj.lname === undefined){
    // statement
}

Лучше не смешивать undefined в качестве значения свойства с несуществующим значением свойства.

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

let obj = {fname:'john'};
if(obj.hasOwnProperty('lname')){  // if its true
 // statement
}

Но hasOwnProperty не работает, когда мы используем свойства, унаследованные цепочкой прототипов. Например:-

let obj = {fname:'vipin'};
let userObj = Object.create(obj);
userObj.age = 25;
userObj.hasOwnProperty('age'); // returns true
userObj.hasOwnProperty('fname'); // returns false

hasOwnProperty не удается проверить унаследованное свойство fname. Чтобы решить эту проблему, мы можем использовать in operator.

Как и hasOwnProperty, оператор in также проверяет унаследованные свойства.

let obj = {fname:'vipin'};
let userObj = Object.create(obj);
userObj.age = 25;
'age' in userObj; // returns true
'fname' in userObj; // returns true

Если вы знаете, что используете только для свойств цепочки, не являющейся прототипом, тогда используйте метод usehasOwnProperty или вы можете использовать оператор in как для свойств цепочки, не являющейся прототипом, так и для свойств цепочки прототипов.