Size: a a a

JavaScript.Ninja

2020 January 05

R

Remite in JavaScript.Ninja
Незнаю в какой вы песочнице проверяете
https://prnt.sc/qjfwk1
источник

CN

Calle Nord in JavaScript.Ninja
Так вы по попробуй не обращаться к свойству, если его нет, через проверку
источник

R

Remite in JavaScript.Ninja
Ну вот для этого и нужно городить вот такой огород  if (foo && foo.bar && foo.bar.baz)
а это громоздко
а тайпскрипт предлагает писать это более элегантно foo?.bar?.baz();
источник

CN

Calle Nord in JavaScript.Ninja
const foo = { bar: { baz: undefined } }; if (foo.bar.baz) foo.bar.baz(); should work
источник

VK

Vladimir Klimov in JavaScript.Ninja
Calle Nord
const foo = { bar: { baz: undefined } }; if (foo.bar.baz) foo.bar.baz(); should work
А теперь сделайте foo.bar.baz.a)
источник

CN

Calle Nord in JavaScript.Ninja
Кстати если foo у вас вообще не будет в коде, выдаст ошибку даже с if (foo?.bar?.baz) { ... }
источник

R

Remite in JavaScript.Ninja
Calle Nord
const foo = { bar: { baz: undefined } }; if (foo.bar.baz) foo.bar.baz(); should work
во первых это более сложная конструкция, во вторых это только в случае если мы ранее убедились что bar !== undefined
источник

R

Remite in JavaScript.Ninja
Calle Nord
Кстати если foo у вас вообще не будет в коде, выдаст ошибку даже с if (foo?.bar?.baz) { ... }
конечно, потому что переменной foo нету
источник

R

Remite in JavaScript.Ninja
но это уже другого поля ягоды
источник

CN

Calle Nord in JavaScript.Ninja
Но можно через try catch обработать такие кейсы
источник

R

Remite in JavaScript.Ninja
Calle Nord
Но можно через try catch обработать такие кейсы
конечно можно, это же просто сахар что бы как раз не городить вот этот огород
источник

CN

Calle Nord in JavaScript.Ninja
Я просто хочу понять проверка if (foo.bar.baz) !== if (foo?.bar?.baz) ? Тогда на что идет проверка : тогда какой смысл так писать
источник

VK

Vladimir Klimov in JavaScript.Ninja
Есть user: {account: {password: ""}}
Вам нужно доступ к паролю как user.account.password
Но если аккаунта нет (null/undefined) - будет ошибка
Optional chaining user.account?.password говорит "если есть аккаунт - дай пароль", а если нету - вернет undefined.
источник

CN

Calle Nord in JavaScript.Ninja
Если аккаунта нету будет ошибка в if (user.account.password) ?
источник

VK

Vladimir Klimov in JavaScript.Ninja
Calle Nord
Если аккаунта нету будет ошибка в if (user.account.password) ?
Да)
источник

VK

Vladimir Klimov in JavaScript.Ninja
Calle Nord
Если аккаунта нету будет ошибка в if (user.account.password) ?
Будет именно exception
источник

CN

Calle Nord in JavaScript.Ninja
О, спасибо мужики
источник

R

Remite in JavaScript.Ninja
Calle Nord
Я просто хочу понять проверка if (foo.bar.baz) !== if (foo?.bar?.baz) ? Тогда на что идет проверка : тогда какой смысл так писать
Представьте что у вас с АПИ приходит огромный обьект и вам нужно вытащить одно свойство, ну например валюту компании которая лежит в обьекте компании

company,info.bank.currenciesInfo.availableCurrencies.currentCurrency

и вот вы сделали запрос на сервер, а он вам вернул

company = {};

ваш код благополучно упал и вы идете искать, или например вернул вам company = {info: {}} и в общем остальное забыл

и что бы Ваш код не падал, а вы взяли какую-то валюту по умолчанию
let currency = null;
if (company && company.info && company.info.bank && company.info.bank.currenciesInfo &&  company.info.bank.currenciesInfo.availableCurrencies && company.info.bank.currenciesInfo.availableCurrencies.currentCurrency) {
   currency = company,info.bank.currenciesInfo.availableCurrencies.currentCurrency
} else {
   currency = 'USD';
}


или можно не писать все палатно а написать с ?.
источник

CN

Calle Nord in JavaScript.Ninja
Вот теперь проверял и понял разницу
источник

VK

Vladimir Klimov in JavaScript.Ninja
Без .? оператора надо писать if(user.account && user.account.password), а с этим оператором все выглядит красиво)
источник