Volitelné řetězení pomáhá vyhnout se nedefinovaným výjimkám funkcí

Četl jsem dokumenty MDN pro optional chaining a narazil jsem na fakt, o kterém jsem nevěděl.

Než se pustíme do mého učení, pojďme se krátce podívat na nový optional chaining Funkce JavaScript. Přidání jazyka umožňuje vývojářům bezpečnější přístup k volitelným hodnotám, které jsou vnořeny hluboko uvnitř objektu.

Proces přístupu k hluboce vnořené vlastnosti objektu může být velmi únavný. Může se stát, že objekt nemá strukturu, kterou očekáváte, nebo že nedefinuje hodnoty, které hledáte. Aby se vývojáři vyhnuli vyvolaným výjimkám, museli před přístupem k hluboce vnořené vlastnosti zkontrolovat existenci každé jednotlivé vlastnosti.

Nový ?. syntaxe pomáhá vývojářům přistupovat k vlastnostem bezpečným způsobem, i když je struktura objektu jiná, než se očekávalo. Podívejme se na příklad:

// object coming from an API, a library or anything you don't control
const someObject = { foo: { bar: { baz: 'someValue' } } };

// old way to access foo.bar.baz 
// -> check all properties to avoid throwing an exception
if (someObject.foo && someObject.foo.bar && someObject.foo.bar.baz) {
  console.log(someObject.foo.bar.baz);
} else {
  console.log('noValue');
}

// new way to access foo.bar.baz
console.log(someObject.foo?.bar?.baz || 'noValue'); 
// 👆 logs 'someValue' because `someObject.foo.bar.baz` is defined
            
console.log(someObject.foo?.bar?.doesNotExist || 'noValue');
// 👆 logs 'noValue' because `someObject.foo.bar.doesNotExist` is not defined
console.log(someObject.doesNotExist?.foo?.bar || 'noValue');
// 👆 logs 'noValue' because `someObject.doesNotExist` is not defined
//    it does not throw an exception for accessing `foo` of `doesNotExist`

optional chaining návrh funkce je v současné době ve fázi 4 procesu návrhu ECMAscript, což znamená, že bude součástí dodatků EcmaScript 2020. Chrome ji již implementuje za příznakem funkce „Experimentální JavaScript“.

Upravit:Nyní je podporováno napříč prohlížeči.

Spustit metody, pokud existují, a vrátit undefined jinak

Nevěděl jsem, že tento návrh také obsahuje mechanismus pro provádění objektových metod, které jsou potenciálně undefined pomocí legračně vypadající syntaxe ?.() .

const someObject = { foo() { return 'someValue'; } };

// execute functions with `?.()` to not throw an exception
// in case it is not defined
console.log(someObject.foo?.() || 'notDefined'); 
// 👆 logs 'someValue' because `someObject.foo?.()` returns 'someValue'

console.log(someObject.bar?.() || 'notDefined');
// 👆 logs 'notDefined' because `someObject.bar?.()` returns undefined
//    instead of throwing an exception

Podle mého názoru je volitelné řetězení a jeho volitelné provádění funkcí velmi vítaným jazykovým doplňkem, který pomůže vyhnout se několika undefined is not a function výjimky.

To znamená, že existují výjimky z nějakého důvodu a vývojáři by měli být velmi opatrní s těmito novými funkcemi, které způsobují, že výjimky „mizí“. Pokud se volitelné zřetězení používá velmi často a/nebo se používá pouze ke skrytí výjimek, je to pravděpodobně nápověda k přehodnocení celkové architektury aplikace.

Nemohu se dočkat, až bude volitelné řetězení podporováno napříč prohlížeči. Chcete-li to použít dnes, babel vás pokryl. A s tím – bavte se, přátelé! 👋

Upraveno:Jak TheIncorrigible1 poukázal na Redditu, volitelné řetězení funguje perfektně spolu s Nullish Coalescing, které byste si také mohli chtít vyzkoušet.