Нөлдүк бириктирүү
нөлдүк бириктирүү оператору (??)
Жаңы мүмкүнчүлүк
Бул өзгөчөлүк тилге жакында кошулган. Эски браузерлер политолтурууну талап кылышы мүмкүн.
Нөл бириктирүү оператору эки суроо белгиси ??.
Ал нөл жана аныкталбаганга бирдей мамиле кылгандыктан, биз бул макала үчүн атайын термин киргизебиз. Кыскача айтканда, эгерде ал нөл эмес же аныкталбаган болсо, маани "аныкталган" деп айтабыз.
туюнтмасынын натыйжасы а ?? б болот:
а аныкталган болсо, анда а,
эгерде а аныкталбаса, анда б.
Башкача айтканда, оператор ?? биринчи аргументти кайтарат, эгерде ал нөл эмес/аныкталбаган болсо, экинчиси.
Нөлдү бириктирүү оператору жаңы нерсе эмес. Бул жөн гана ыңгайлуу синтаксис, "аныкталган" эки мааниден кантип бирин алуу керек.
Бул жерде сиз натыйжаны = a ?? б, бизге мурунтан эле тааныш операторлорду колдонуу:
натыйжа = (a !== null && a !== undefined) ? a : b;
Эми эмне кылаары так болушу керек. Келгиле, бул пайдалуу болушу мүмкүн экенин карап көрөлү.
Эреже катары, оператор ?? мүмкүн болгон аныкталбаган өзгөрмө үчүн демейки маанини коюу үчүн керек.
Мисалы, бул жерде биз колдонуучуну көрсөтөбүз, эгерде анын мааниси null/аныкталбаган болсо, антпесе Anonymous:
колдонуучуга уруксат берүү;
alert(колдонуучу ?? "анонимдүү"); // Анонимдүү (колдонуучу жок)
Бул жерде колдонуучуга маани берилген мисал:
let user = "Джон";
alert(колдонуучу ?? "анонимдүү"); // Иван (колдонуучу бар)
Же болбосо, тизмедеги нөл/аныкталбаган биринчи маанини алуу үчүн ?? операторлорунун ырааттуулугун жазсаңыз болот.FirstName, LastName же nickName өзгөрмөлөрүндө колдонуучу дайындары бар дейли. Колдонуучу тиешелүү маанини киргизбөөнү чечсе, алардын баары жок болушу мүмкүн.
Колдонуучунун атын ушул өзгөрмөлөрдүн бири менен көрсөткүбүз келет же алардын баары нөл/аныкталбаган болсо, "Анонимдүү" дегенди көрсөткүбүз келет.
Бул үчүн биз ?? операторун колдонобуз:
let firstName = null;
let фамилия = null;
let nickName = "Суперкодер";
// аныкталган биринчи маанини көрсөтөт:
эскертүү (аты-жөнү ?? фамилиясы ?? ник ?? "Анонимдүү"); // Superencoder
|| менен салыштыруу
ЖЕ оператор || мурунку бөлүмдө көрсөтүлгөндөй эле ?? үчүн колдонулушу мүмкүн.
Мисалы, жогорудагы коддо сиз алмаштырсаңыз ?? || менен, натыйжа бирдей болот:
let firstName = null;
let фамилия = null;
let nickName = "Суперкодер";
// биринчи чыныгы маанини көрсөтөт:
alert(firstName || фамилия || ник || "Анонимдүү"); // Superencoder
Тарыхта ЖЕ оператору || биринчи пайда болгон. Бул JavaScript-те башынан эле бар, ошондуктан иштеп чыгуучулар аны көптөн бери ушундай максаттарда колдонуп келишкен.
Башка жагынан алганда, нөлдү бириктирүү оператору ?? - көптөр || операторуна нааразы болгону үчүн.
Алардын ортосундагы маанилүү айырма болуп саналат:
|| биринчи чыныгы маанини кайтарат.
?? көрсөтүлгөн биринчи маанини кайтарат.
Жөнөкөй сөз менен айтканда, оператор || false, 0, бош сап "" жана null/undefined ортосунда айырмаланбайт. Ал үчүн алардын баары бирдей, б.а. жалган баалуулуктар.Эгерде операторго биринчи аргумент || саналып өткөн баалуулуктардын кайсынысы болбосун, натыйжада биз экинчи аргументти алабыз.
Бирок, иш жүзүндө көбүнчө өзгөрмө нөл/аныкталбаган учурда гана демейки маанини колдонуу зарыл. Кантсе да, бул маани чындыгында белгисиз/аныкталбаган.
Төмөнкү мисалды карап көрөлү:
бийиктиги = 0 болсун;
эскертүү (бийиктик || 100); // 100
эскертүү (бийиктиги ?? 100); // 0
бийиктиги || 100 бийиктикти жалган мааниге текшерет, ал 0, ооба, жалган.
ошондуктан натыйжа || экинчи аргумент болуп саналат, б.а. 100.
бийиктик?? 100 бийиктиктин өзгөрмөсүнүн нөл/аныкталбаганын текшерет жана ал эмес болгондуктан,
анда натыйжа бийиктик өзгөрмөнүн өзү, б.а. 0.
Иш жүзүндө, нөл бийиктиги демейки мааниге алмаштырылбашы керек болгон демейки нормалдуу маани болуп саналат. Ошентип, ?? бул жерде ал кандай болушу керек болсо, ошондой иштейт.
Приоритет
Оператордун артыкчылыгы ?? || менен бирдей. Экөө тең MDN боюнча таблицада 3кө барабар.
Бул || сыяктуу, нөлдү бириктирүү оператору ?? = жана ? чейин баалайт, бирок +, * сыяктуу башка операциялардын көбүнөн кийин.
Ошентип, бул түрдөгү сөз айкаштарында кашаалар керек:
letheight = null;
letwidth = null;
// маанилүү: кашааларды колдонуңуз
болсун аянты = (бийиктиги ?? 100) * (туурасы ?? 50);
эскертүү (аймак); // 5000
Болбосо, кашаалар алынып салынса, биринчи * оператору аткарылат, анткени ал ??га караганда жогорураак артыкчылыкка ээ жана бул туура эмес жыйынтыктарга алып келет.
// кашаа жок
аянты = бийиктик болсун ?? 100* туурасы ?? 50;
// ...мындай иштейт (такыр биз каалагандай эмес):
аянты = бийиктик болсун ?? (100* туурасы) ?? 50;
Колдонуу ?? && же || менен бирге
Коопсуздук максатында, JavaScript ?? && жана || менен бирге, эгерде артыкчылык кашаа аркылуу ачык көрсөтүлбөсө.
Төмөнкү кодду иштетүү синтаксистик катага алып келет:
x = 1 && 2 болсун ?? 3; // Синтаксис катасы
Бул, албетте, талаштуу чектөө, адамдар ||ден көчүп баштаганда программалоо мүчүлүштүктөрүн болтурбоо үчүн тил спецификациясына кошулган. боюнча ??.
Бул чектөөнү айланып өтүү үчүн кашааларды колдонуңуз:
болсун x = (1 && 2) ?? 3; // Катасыз иштейт
alert(x); // 2
Бардыгы
null бириктирүү оператору ?? тизмеден биринчи "аныкталган" маанини тандоонун тез жолу.
Өзгөрмөлөргө демейки маанилерди дайындоо үчүн колдонулат:
// бийиктик нөл же аныкталбаган болсо, height=100 болот
бийиктик = бийиктик?? 100;
оператор?? караганда бир аз гана жогору, өтө төмөн артыкчылыкка ээ? жана =, ошондуктан аны сөз айкашында колдонууда кашаалар талап кылынышы мүмкүн.
|| менен бирге колдонууга тыюу салынат же && эч кандай ачык артыкчылык менен, б.а. кашаалар жок.