Нулевой оператор объединения '??'
В этой статье мы ссылаемся на ценности, которые не являются ниnullни одинundefinedВыражение называется "определено".
Нулевой оператор объединения записывается в виде двух вопросительных знаков.??.
a ?? bРезультат:
- если
aопределено, результатa, - если
aне определено, результатb.
Другими словами, если первый аргумент неnull/undefined,но??Вернуть первый параметр. В противном случае верните второй параметр.
В операторе объединения null нет ничего нового. Это просто хороший синтаксис для получения первого «определенного» значения из двух.
Мы можем переписать, используя наши известные операторыresult = a ?? b,так:
result = (a !== null && a !== undefined) ? a : b;
как правило??Вариант использования заключается в предоставлении значения по умолчанию для переменной, которая может быть неопределенной.
Например, здесь, еслиuserне определено, мы показываемAnonymous:
let user;
alert(user ?? "Anonymous"); // Anonymous
Конечно, еслиuserЗначение делится наnull/undefinedлюбое значение снаружи, то мы видим следующее:
let user = "John";
alert(user ?? "Anonymous"); // John
мы также можем использовать??Sequence выбирает первый не-null/undefinedценность .
Предположим, мы находимся в переменнойfirstName,lastNameилиnickNameВ нем хранятся данные пользователя. Значение всех этих переменных может быть неопределенным, если пользователь решит не вводить значение.
Мы хотим отобразить имя пользователя с помощью одной из этих переменных или «Анонимно», если все значения этих переменных не определены.
давайте использовать??оператор для достижения этого требования:
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// 显示第一个已定义的值
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder
Сравните с ||
или оператор||можно использовать с??операторы используются одинаково. как мыпредыдущая главакак сказано.
Например, в приведенном выше коде мы можем использовать||заменять??, тот же результат также может быть получен:
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// 显示第一个真值:
alert(firstName || lastName || nickName || "Anonymous"); // Supercoder
или||Операторы существуют на заре JavaScript, поэтому разработчики уже давно используют их для этой цели.
С другой стороны, нулевой оператор объединения??был только недавно добавлен в JavaScript, и это произошло потому, что люди||Не так доволен.
Важными различиями между ними являются:
-
||вернуть первыйнастоящийстоимость. -
??вернуть первыйопределенныйстоимость.
другими словами,||неразличимыйfalse,0, пустой строки""а такжеnull/undefined. Они все одинаковые - ложные ценности. если кто-то из них||первый параметр, то в результате мы получим второй параметр.
На практике, однако, мы можем захотеть изменить только значение переменнойnull/undefinedиспользуйте значение по умолчанию. То есть, когда значение действительно неизвестно или не установлено.
Например, рассмотрим следующую ситуацию:
let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
-
height || 100сначала проверюheightявляется ложным значением, найдите, что это так.- Итак, результатом является второй параметр,
100.
- Итак, результатом является второй параметр,
-
height ?? 100сначала проверюheightЭтоnull/undefined, обнаружил, что это не так.- Итак, результат
heightисходное значение ,0.
- Итак, результат
если высота0является допустимым значением, его не следует заменять значением по умолчанию, поэтому??можно получить правильные результаты.
приоритет
??Операторы имеют довольно низкий приоритет: вMDN tableЧжунвэй5. следовательно,??существует=а также?вычисляется до, но до большинства других операторов (например,+а также*), а затем вычисляется.
Итак, если нам нужно использовать в выражении, где есть другие операторы??Чтобы получить значение, вам нужно рассмотреть возможность добавления круглых скобок:
let height = null;
let width = null;
// 重要:使用括号
let area = (height ?? 100) * (width ?? 50);
alert(area); // 5000
В противном случае, если мы опустим скобки, так как*соотношение приоритетов??high, он будет выполняться первым, что приведет к неверным результатам.
// 没有括号
let area = height ?? 100 * width ?? 50;
// ……与下面这行代码的计算方式相同(应该不是我们所期望的):
let area = height ?? (100 * width) ?? 50;
??а также&&или||использовать вместе
Из соображений безопасности JavaScript запрещает??оператор и&&а также||операторы вместе, если приоритет не указан явно с помощью круглых скобок.
Следующий код вызывает синтаксическую ошибку:
let x = 1 && 2 ?? 3; // Syntax error
Это ограничение, несомненно, является спорным, но оно было добавлено в спецификацию языка, чтобы избежать людей,||переключиться на??ошибка программирования.
Это можно решить, явно используя круглые скобки:
let x = (1 && 2) ?? 3; // 正常工作了
alert(x); // 2
Суммировать
-
Нулевой оператор объединения
??Предоставляет простой способ выбора первого «определенного» значения из списка.Он используется для присвоения значений по умолчанию переменным:
// 当 height 的值为 null 或 undefined 时,将 height 的值设置为 100 height = height ?? 100; -
??Операторы имеют очень низкий приоритет, лишь немного выше?а также=, поэтому рассмотрите возможность добавления круглых скобок при использовании его в выражении. -
Его нельзя комбинировать со скобками без явного добавления скобок.
||или&&использовать вместе.
Учебники по современному JavaScript: учебные пособия по современному JavaScript с открытым исходным кодом, от начального до продвинутого.Рекомендовано официальной документацией React, учебным пособием по JavaScript вместе с MDN..
Читайте онлайн бесплатно:zh.javascript.info
В WeChat найдите публичный аккаунт «Technology Talk», подпишитесь на более интересный контент: