Почему при отсутствии свойств у объекта выдается ошибка, а не undefined?

104
30 сентября 2019, 04:10

Есть пустой объект:

var testObj = {};

Допустим, где-то у себя в коде я пытаюсь проверить есть ли у этого объекта какое-то свойство:

console.log(typeof testObj.test);   // undefined

Я получу undefined, его нет, всё хорошо.

НО, если я пойду дальше и вызову

console.log(typeof testObj.test.var);

Я получу ошибку Uncaught TypeError: Cannot read property 'var' of undefined.

Почему Javascript не скажет мне так же undefined? Он скажет только в том случае, если внутри testObj, я определю test.

Получается, что объекты должны иметь определенную структуру? Но как быть, если я получаю от сервера разные json данные, с произвольной структурой. Я запишу эти данные в объект. Начну проверять, каких-то данных не окажется и Javascript выдаст ошибку.

Как мне сделать так, чтобы я смог написать, что-то вроде(при условии что testObj пустой объект):

if(testObj.test.var === "OK"){
    console.log("ok!")
}
Answer 1

Потому что так описано в спецификации оператора typeof.

Как мне сделать так, чтобы я смог написать, что-то вроде(при условии что testObj пустой объект):

Только добавив проверки вручную:

if(testObj && testObj.test && testObj.test.var === "OK"){
    console.log("ok!")
}
Answer 2

В этом случае объект существует и у него есть свойство, значение которого undefined:

console.log(typeof testObj.test);

А в этом,

console.log(typeof testObj.test.var);

транслятор не может присвоить свойство и, соответственно, получить его значение потому что объекта, к которому вы пытаетесь обратиться не существует, о чем транслятор и говорит явно - Cannot read property 'var' of undefined (Не могу получить свойство var у undefined).

READ ALSO
Не работает функция play() на мобильных

Не работает функция play() на мобильных

Нужно при загрузке страницы в iframe воспроизводить звуковой файлНа ПК всё работает, на мобильных устройствах (Chrome, Safari) звука нет

117
getBoundingClientRect не коректная работа с zoom [закрыт]

getBoundingClientRect не коректная работа с zoom [закрыт]

Когда я прошу getBoundingClientRect у img то left right top bottom возвращаются некорректные данные то есть при движении картинки в право left right уменьшаются (тоже...

122
Динамический меню на Angular 7

Динамический меню на Angular 7

Передо мной вот такая задача создать динамический меню на Angular 7У меня вот такой JSON

136
Как повернуть маркер в leaflet js?

Как повернуть маркер в leaflet js?

подскажите как повернуть маркер в leaflet js в зависимости от стартовой точки и конечной точки? Использую ext js

110