Комментарии 15
github.com/facebookincubator/idx
Важное дополнение: в комплекте также идет babel-plugin, который позволяет превратить эту конструкцию в набор тернарных операторов, чтобы избавиться от try/catch в продакшене.
a = obj?.prop1?.prop2.?prop3?;
А теперь, часто вам попадается такой; вариант:
a = obj?.prop1?.prop2.prop3?;
Наверное нечасто! Тем, кто не заметил: идет обращение к свойству свойства prop2 без контроля на null.
Я предложил бы писать так:
a = ?obj.prop1.prop2.prop3;
То есть контролировать все этапы получения значения в выражении, перед которым условный символ, скажем наш ?, причём для странных ситуаций, где в середине выражения проверки не нужны, скобки помогут.
let obj = {};
console.log(obj.someProp); //ошибки не будет
Ну или если мы совсем не влияем на то что к нам приходит:
if (typeof obj === "object") {
console.log(obj.someProp); //ошибки не будет
} else {
...
}
...
const obj = {
items: [{ someObj: {} }]
};
const someObj = optional(obj, target => target.items[0].someObj, "def");
console.log(someObj.someProp) // "def"
ну и вызов proxify со вторым аргументом не нужен — proxify принимает один аргумент
((obj.prop1 || {}).prop2 || {}).prop3
Куча скобочек из ниоткуда, превращающих чтение кода в игру "найди пару". Плюс false, 0 и пустая строка превращаются в пустой объект, что может оказаться багом. А уж вызов метода в таком стиле выглядит еще страшнее:
(obj.prop1 || (() => {}))();
false, 0 и пустая строка превращаются в пустой объект
На практика в большинстве случаев можно расчитывать, что на месте prop1 или prop2 может быть только объект, null и undefined, а prop3 уже не заменяется.
А уж вызов метода в таком стиле выглядит еще страшнее
я и не говорил, что решение универсальное, в каких-то случаях подходит, в каких-то нет. Скажем a?.b
я бы на сегодняшний день записал как a && a.b
, а вот конструкцию a.b.c.d?.e
однозначно как (a.b.c.d || {}).e
, вариант a.b.c.d && a.b.c.d.e
при не односимвольных именах будет заметно длиннее.
Настоящее и будущее безопасной работы с null и undefined в JavaScript