?? (nullish coalescing) օպերատորը ECMAScript ստանդարտի մեջ ավելացրել են վերջին տարիներին (Edition 11, 2020 թվականի Հունիս ամիս): Այդ իսկ պատճառով այն սպասարկվում է ոչ բոլոր բրաուզերների կողմից։ Այս հղումով կարող եք ծանոթանալ դրանց ցանկին։
?? (nullish coalescing)-ը տրամաբանական օպերատոր է, որը վերադարձնում է աջ օպերանդի արժեքը, եթե ձախ օպերանդի արժեքը null կամ undefined է, հակառակ դեպքում այն վերադարձնում է ձախ օպերանդի արժեքը։ Օրինակ՝
const text = null ?? "default string";
console.log(text); // "default string"
const number = 0 ?? 42;
console.log(number); // 0
Ինչպես տեսնում ենք վերևում բերված օրինակների մեջ՝ ձախ կողմի օպերանդի արժեքը հաշվարկվում և վերադարձվում է անգամ այն դեպքում, երբ վերափոխվելով Բուլյան տիպի, ընդունում է falsy արժեք՝ բացառությամբ null-ի և undefined-ի։ Հենց դրանով էլ ?? (nullish coalescing) տրամաբանական օպերատորը տարբերվում է || (OR) տրամաբանական օպերատորից։ Փորձենք վերևում բերված օրինակը կատարել OR (||) օպերատորի օգնությամբ՝
const text = null || "default string";
console.log(text); // "default string"
const number = 0 || 42;
console.log(number); // 42
Եվ այսպես առաջին օրինակում երկու տրամաբանական օպերատորներն էլ նույն կերպ են աշխատում, սակայն երկրորդ օրինակի մեջ նրանց վերադարձրած արժեքները տարբերվում են։ || օպերատորը վերադարձնում է առաջին truthy արժեքը՝ 42-ը, այն դեպքում երբ ??-ը վերադարձնում է առաջին արժեքը, որը չի հանդիսանում null կամ undefined, թեև այն կարող է նաև falsy արժեք լինել, մեր օրինակում՝ 0։
falsy արժեքների (0, -0, 0n, NaN, "", null, undefined, false) և տիպերի վերափոխման մասին առավել մանրամասն կարող եք կարդալ այս հղումով։
Ինչպես և && (AND) և || (OR) տրամաբանական օպերատորների դեպքում էր՝ ?? (nullish coalescing) օպերատորը նույնպես կարող է օգտագործվել շղթայի մեջ, օրինակ՝
let someValue; // ստեղծում ենք someValue փոփոխականը, սակայն նրան արժեք չենք վերագրում, ինչի արդյունքում այն հավասար է լինում undefined-ի:
const value = null ?? someValue ?? 42 ?? "default string";
console.log(value); // 42
?? օպերատորն ունի ցածր առաջնահերթություն, առաջնահերթությունների աղյուսակի մեջ նրա ինդեքսը 5 է, ինչը բարձր է = (վերագրման օպերատոր), ? (պայմանական կամ թերնարի օպերատոր)-ներից, սակայն ցածր է հաճախ օգտագործվող հիմնական օպերատորներից՝ +, *, ++, ** և այլն։
Ի դեպ համանման օպերատոր կա ոչ միայն JavaScript-ի, այլ նաև մի շարք այլ ծրագրավորման լեզուների մեջ, օրինակ՝ C#-ի, Perl-ի (սկսած 5․10 տարբերակից), Swift-ի, PHP-ի (սկսած 7․0․0 տարբերակից ) և այլն։
2019 թվականի Նոյեմբերին թողարկված TypeScript 3.7 տարբերակի մեջ այն արդեն առկա էր, և բազմաթիվ դրական արձագանքներից հետո երկար ժամանակ մշակման փուլում գտնվող այս նորույթը վերջնականապես որոշվեց ավելացնել ECMAScript-ի 2020 թվականին թողարկված ստանդարտի մեջ։