Baseline Widely available
ÐпеÑаÑÐ¾Ñ Ð¾Ð¿ÑионалÑной поÑледоваÑелÑноÑÑи ?.
позволÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð½Ð°Ñение ÑвойÑÑва, наÑ
одÑÑегоÑÑ Ð½Ð° лÑбом ÑÑовне вложенноÑÑи в ÑепоÑке ÑвÑзаннÑÑ
Ð¼ÐµÐ¶Ð´Ñ Ñобой обÑекÑов, без необÑ
одимоÑÑи пÑовеÑÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ из пÑомежÑÑоÑнÑÑ
ÑвойÑÑв в ней на ÑÑÑеÑÑвование. ?.
ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ опеÑаÑоÑÑ .
, за иÑклÑÑением Ñого, ÑÑо не вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение, еÑли обÑекÑ, к ÑвойÑÑÐ²Ñ Ð¸Ð»Ð¸ меÑÐ¾Ð´Ñ ÐºÐ¾ÑоÑого идÑÑ Ð¾Ð±ÑаÑение, Ñавен null
или undefined
. Ð ÑÑиÑ
ÑлÑÑаÑÑ
он возвÑаÑÐ°ÐµÑ undefined
.
Таким обÑазом, Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем более коÑоÑкий и понÑÑнÑй код пÑи обÑаÑении к вложеннÑм по ÑепоÑке ÑвойÑÑвам обÑекÑа, когда еÑÑÑ Ð²ÐµÑоÑÑноÑÑÑ, ÑÑо какое-Ñо из Ð½Ð¸Ñ Ð¾ÑÑÑÑÑÑвÑеÑ.
ÐнÑеÑакÑивнÑй пÑимеÑconst adventurer = {
name: "Alice",
cat: {
name: "Dinah",
},
};
const dogName = adventurer.dog?.name;
console.log(dogName);
// Expected output: undefined
console.log(adventurer.someNonExistentMethod?.());
// Expected output: undefined
СинÑакÑиÑ
obj?.prop;
obj?.[expr];
arr?.[index];
func?.(args);
ÐпиÑание
ÐпеÑаÑÐ¾Ñ Ð¾Ð¿ÑионалÑной поÑледоваÑелÑноÑÑи пÑедоÑÑавлÑÐµÑ ÑпоÑоб ÑпÑоÑÑиÑÑ Ð´Ð¾ÑÑÑп к знаÑениÑм в ÑепоÑке обÑекÑов, когда возможно, ÑÑо какое-Ñо ÑвойÑÑво (или меÑод) в ней Ñавно undefined
или null
.
ÐÐ»Ñ Ð¿ÑимеÑа, Ñоздадим обÑÐµÐºÑ obj
, имеÑÑий вложеннÑÑ ÑÑÑÑкÑÑÑÑ. Ðез опеÑаÑоÑа опÑионалÑной поÑледоваÑелÑноÑÑи поиÑк глÑбоко ÑаÑположеннÑÑ
подÑвойÑÑв ÑÑебÑÐµÑ Ð¿ÑовеÑки вÑеÑ
пÑомежÑÑоÑнÑÑ
ÑвойÑÑв на ÑÑÑеÑÑвование, напÑимеÑ:
let nestedProp = obj.first && obj.first.second;
ÐÑли обÑаÑаÑÑÑÑ Ðº obj.first.second
без пÑовеÑки obj.first
, Ñо, еÑли ÑвойÑÑво obj.first
Ñавно null
или undefined
, вÑбÑоÑиÑÑÑ Ð¸ÑклÑÑение TypeError
.
Ðднако, Ñ Ð¾Ð¿ÐµÑаÑоÑом опÑионалÑной поÑледоваÑелÑноÑÑи (?.
) не ÑÑебÑеÑÑÑ Ñвно пÑовеÑÑÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° obj.first
пеÑед обÑаÑением к obj.first.second
:
let nestedProp = obj.first?.second;
ÐÑли иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ?.
вмеÑÑо .
, JavaScript Ð·Ð½Ð°ÐµÑ Ð¾ необÑ
одимоÑÑи пÑовеÑки obj.first
пеÑед обÑаÑением к obj.first.second
. ÐÑли знаÑение obj.first
Ñавно null
или undefined
, вÑполнение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки пÑекÑаÑаеÑÑÑ Ð¸ возвÑаÑаеÑÑÑ undefined
.
ÐÑо ÑквиваленÑно ÑледÑÑÑÐµÐ¼Ñ (кÑоме ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñеменной пеÑеменной):
let temp = obj.first;
let nestedProp = temp === null || temp === undefined ? undefined : temp.second;
ÐпÑионалÑÐ½Ð°Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ñ Ð²Ñзовом ÑÑнкÑии
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ?.
, когда необÑ
одимо вÑзваÑÑ Ð¼ÐµÑод, коÑоÑого Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑÑÑеÑÑвоваÑÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, напÑимеÑ, пÑи иÑполÑзовании API, в коÑоÑом меÑод Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпен из-за ÑÑÑаÑÐµÐ²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ не поддеÑживаемоÑÑи ÑÑÑÑойÑÑвом полÑзоваÑелÑ.
ÐÑполÑзование ?.
Ñ Ð²Ñзовом ÑÑнкÑии знаÑиÑ, ÑÑо вÑполнение авÑомаÑиÑеÑки веÑнÑÑ undefined
, а не вÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑение, еÑли меÑод не найден:
let result = someInterface.customMethod?.();
ÐÑимеÑание: ÐÐ»Ñ ÑÑÑеÑÑвÑÑÑего ÑвойÑÑва, не ÑвлÑÑÑегоÑÑ ÑÑнкÑией, иÑполÑзование конÑÑÑÑкÑии x.y?.()
вÑÑ Ñавно вÑбÑоÑÐ¸Ñ TypeError
иÑклÑÑение (x.y не ÑвлÑеÑÑÑ ÑÑнкÑией
).
ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе колбÑк-ÑÑнкÑии или извлекаеÑе меÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа деÑÑÑÑкÑÑÑиÑÑÑÑим пÑиÑваиванием, ÐÑ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð½ÐµÑÑÑеÑÑвÑÑÑие знаÑениÑ, коÑоÑÑе нелÑÐ·Ñ Ð²ÑзÑваÑÑ ÐºÐ°Ðº ÑÑнкÑии до пÑовеÑки на иÑ
ÑÑÑеÑÑвование. ÐÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ?.
, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе избежаÑÑ Ð»Ð¸ÑниÑ
пÑовеÑок:
// С иÑполÑзованием ES2019
function doSomething(onContent, onError) {
try {
// ... делаем ÑÑо-Ñо Ñ Ð´Ð°Ð½Ð½Ñми
} catch (err) {
if (onError) {
// пÑовеÑÑем, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ onError
onError(err.message);
}
}
}
// С иÑполÑзованием опеÑаÑоÑа опÑионалÑной поÑледоваÑелÑноÑÑи
function doSomething(onContent, onError) {
try {
// ... делаем ÑÑо-Ñо Ñ Ð´Ð°Ð½Ð½Ñми
} catch (err) {
onError?.(err.message); // не вÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑение, еÑли onError Ñавен undefined
}
}
ÐпÑионалÑнÑе поÑледоваÑелÑноÑÑи в вÑÑажениÑÑ
ÐÑ Ñакже можеÑе иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¾Ð¿ÑионалÑной поÑледоваÑелÑноÑÑи, когда обÑаÑаеÑеÑÑ Ðº ÑвойÑÑÐ²Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑкобоÑной ноÑаÑии:
let nestedProp = obj?.["prop" + "Name"];
ÐÑимеÑÑ ÐазовÑй пÑимеÑ
Ð ÑÑом пÑимеÑе пÑоизводиÑÑÑ Ð¾Ð±ÑаÑение к ÑвойÑÑÐ²Ñ name
ÑлеменÑа Ñ ÐºÐ»ÑÑом bar
обÑекÑа Map
. ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ñаким клÑÑом оÑÑÑÑÑÑвÑеÑ, но иÑклÑÑение вÑбÑоÑено не бÑдеÑ; nameBar
Ñавен undefined
.
let myMap = new Map();
myMap.set("foo", { name: "baz", desc: "inga" });
let nameBar = myMap.get("bar")?.name;
СокÑаÑÑнное вÑполнение
ÐÑи иÑполÑзовании опеÑаÑоÑа опÑионалÑной поÑледоваÑелÑноÑÑи в вÑÑажениÑÑ
, где Ð»ÐµÐ²Ð°Ñ ÑаÑÑÑ Ð¾Ð¿ÐµÑанда Ñавна null
или undefined
, вÑÑажение не бÑÐ´ÐµÑ Ð²Ñполнено. ÐапÑимеÑ:
let potentiallyNullObj = null;
let x = 0;
let prop = potentiallyNullObj?.[x++];
console.log(x); // 0, Ñ.к. x не бÑл инкÑеменÑиÑован
СовмеÑÑное иÑполÑзование опеÑаÑоÑов опÑионалÑной поÑледоваÑелÑноÑÑи
Ðо вложеннÑÑ Ð¾Ð±ÑекÑÐ°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзование опеÑаÑоÑа опÑионалÑной поÑледоваÑелÑноÑÑи неогÑаниÑенное колиÑеÑÑво Ñаз:
let customer = {
name: "Carl",
details: {
age: 82,
location: "Paradise Falls", // ÑоÑнÑй адÑÐµÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑен
},
};
let customerCity = customer.details?.address?.city;
// ⦠ÑÑо Ñакже ÑабоÑÐ°ÐµÑ Ñ Ð²Ñзовами ÑÑнкÑий
let duration = vacations.trip?.getTime?.();
ÐÑполÑзование Ñ Ð¾Ð¿ÐµÑаÑоÑом ??
ÐпеÑаÑÐ¾Ñ ?? Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ð¾Ñле опÑионалÑной поÑледоваÑелÑноÑÑи Ð´Ð»Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ:
let customer = {
name: "Carl",
details: { age: 82 },
};
const customerCity = customer?.city ?? "Unknown city";
console.log(customerCity); // Unknown city
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4