Когда мы кодируем на 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
как для свойств цепочки, не являющейся прототипом, так и для свойств цепочки прототипов.