Есть ли в Javascript пустой оператор слияния?
Например, в C # я могу сделать это:
String someString = null;
var whatIWant = someString ?? "Cookies!";
Лучшее приближение, которое я могу выяснить для Javascript, это использование условного оператора:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
Который является Сорти Ики ИМХО. Могу ли я сделать лучше?
javascript
operators
null-coalescing-operator
null-coalescing
Даниэль Шаффер
источник
источник
x ?? y
синтаксис сейчас находится на этапе 1, статус заявки - слияние нулевоеx ?? y
) и необязательный оператор цепочки (user.address?.street
) теперь являются 4-й стадией. Вот хорошее описание того, что это значит: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Ответы:
Обновить
JavaScript теперь поддерживает нулевой оператор объединения (??) . Он возвращает свой правый операнд, когда его левый операнд равен
null
илиundefined
, и в противном случае возвращает свой левый операнд.Пожалуйста, проверьте совместимость перед использованием.
JavaScript-эквивалент оператора объединения нулей в C # (
??
) использует логическое ИЛИ (||
):Есть случаи (пояснено ниже), что поведение не будет соответствовать поведению C #, но это общий, краткий способ назначения значений по умолчанию / альтернативных значений в JavaScript.
осветление
Независимо от типа первого операнда, если приведение его к логическому результату приводит к тому
false
, что в назначении будет использоваться второй операнд. Остерегайтесь всех случаев ниже:Это означает:
источник
||
возвращается первое значение «truey» или последнее значение «false» (если ни одно из них не может иметь значение true), и это&&
работает противоположным образом: возвращает последнее значение truey или первое значение «false».var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
var value = myObj && myObj.property || ''
вернется к тому,''
что myObj или myObj.property ложные.это решение работает как функция объединения SQL, оно принимает любое количество аргументов и возвращает ноль, если ни один из них не имеет значения. Ведет себя как C # ?? оператор в том смысле, что "", false и 0 считаются NOT NULL и поэтому считаются фактическими значениями. Если вы пришли из .net фона, это будет самое естественное решение для чувства.
источник
for(var i in arguments)
не гарантирует порядок итераций . См. Также Почему JavaScript для цикла In… In не рекомендуется для массивов? и почему использование «for… in» с итерацией массива такая плохая идея? ,Да, это скоро. Смотрите предложение здесь и статус реализации здесь .
Это выглядит так:
пример
источник
x ?? y
) и необязательный оператор цепочки (user.address?.street
) теперь являются 4-й стадией. Вот хорошее описание того, что это значит: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Если в вашем случае
||
замена C #??
недостаточно хороша, поскольку она поглощает пустые строки и нули, вы всегда можете написать свою собственную функцию:источник
false
если (строго) null / undefined иtrue
иначе - используя это с логическим или; это может быть более читабельным, чем многие вызовы вложенных функций. например$N(a) || $N(b) || $N(c) || d
, более читабельно, чем$N($N($N(a, b), c), d)
.if .. return .. else ... return
это идеальный случай для троичного.return (value === null || value === void 0) ? ifnull : value;
Никто не упомянул здесь потенциал для
NaN
, который - для меня - также нулевое значение. Итак, я решил добавить свои два цента.Для данного кода:
Если вы используете
||
оператор, вы получите первое не ложное значение:Если вы используете типичный метод объединения, как выложено здесь , вы получите
c
, который имеет значение:NaN
Ничто из этого не кажется мне правильным. В моем собственном маленьком мире логики слияния, который может отличаться от вашего мира, я считаю, что undefined, null и NaN - все это «ноль». Итак, я ожидал бы получить обратно
d
(ноль) от метода объединения.Если чей-то мозг работает, как мой, и вы хотите исключить его
NaN
, то этот метод выполнит следующее:Для тех, кто хочет, чтобы код был как можно более коротким, и не возражал против некоторой неясности, вы также можете использовать это, как предложено @impinball. Это использует тот факт, что NaN никогда не равен NaN. Вы можете прочитать больше об этом здесь: почему NaN не равен NaN?
источник
typeof
+num.toString() === 'NaN'
избыточен), сохраняйте текущий аргумент в переменной вместоarguments[i]
.!== 'number'
чек, так как уже оценил, что это не такnull
или нетundefined
, но преимущество в том, что он очень понятен любому, кто читает этот код, и условие будет работать независимо от порядка. Ваши другие предложения немного сокращают код, поэтому я буду их использовать.arg !== arg
, но вам нужно, чтобы это былоarg === arg
... тогда это работает. Тем не менее, это имеет тот недостаток, что очень непонятно, что вы делаете ... требуется комментарий в коде, чтобы предотвратить его удаление следующим человеком, который просматривает код и считаетarg === arg
излишним ... но я подниму это тем не мение.остерегайтесь специфического для JavaScript определения ноля. Есть два определения «нет значения» в JavaScript. 1. Null: когда переменная имеет значение null, это означает, что в ней нет данных, но переменная уже определена в коде. нравится:
в таком случае тип вашей переменной на самом деле Object. Попробуй это.
Не определено: когда переменная не была определена ранее в коде и, как ожидается, она не содержит никакого значения. нравится:
в таком случае тип вашей переменной «неопределенный».
обратите внимание, что если вы используете оператор сравнения преобразования типов (==), JavaScript будет действовать одинаково для обоих этих пустых значений. чтобы различать их, всегда используйте оператор сравнения со строгим типом (===).
источник
var u = undefined;
Прочитав ваше разъяснение, ответ @Ates Goral показывает, как выполнить ту же самую операцию, которую вы выполняете в C # в JavaScript.
Ответ @ Gumbo обеспечивает лучший способ проверить на ноль; тем не менее, важно отметить разницу в
==
сравнении===
с JavaScript, особенно когда речь идет о проверкеundefined
и / или проверкеnull
.Там действительно хорошая статья о разнице в двух слагаемых здесь . По сути, следует понимать, что если вы используете
==
вместо этого===
, JavaScript попытается объединить сравниваемые значения и вернуть результат сравнения после этого слияния.источник
Обратите внимание, что
create-react-app
цепочка инструментов React поддерживает объединение нулей с версии 3.3.0 (выпущена 5.12.2019) . Из заметок о выпуске:create-react-app
Тем не менее, если вы используете 3.3.0+, вы можете начать использовать оператор null-coalesce уже сегодня в своих приложениях React.источник
Да, и его предложение сейчас 4-й этап . Это означает, что предложение готово для включения в официальный стандарт ECMAScript. Вы уже можете использовать его в последних версиях Chrome, Edge и Firefox для настольных ПК, но нам придется подождать немного дольше, пока эта функция не достигнет кросс-браузерной стабильности.
Посмотрите на следующий пример, чтобы продемонстрировать его поведение:
Предыдущий пример эквивалентен:
Обратите внимание, что нулевое объединение не будет угрожать ложным значениям так, как это
||
делал оператор (он только проверяет наличиеundefined
илиnull
значения), поэтому следующий фрагмент будет действовать следующим образом:Для пользователей TypesScript, начиная с TypeScript 3.7 , эта функция теперь также доступна.
источник
Мы надеемся, что скоро он будет доступен в Javascript, так как он находится на этапе предложения с апреля 2020 года. Вы можете отслеживать статус здесь для совместимости и поддержки - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Справочник / Операторы / Nullish_coalescing_operator
Для людей, использующих Typescript, вы можете использовать нулевой оператор объединения из Typescript 3.7.
Из документов -
источник
Хорошо правильный ответ
Существует ли это в JavaScript? Да, это так. НО. Это в настоящее время по состоянию на 2020-02-06 на этапе 3 и пока не поддерживается везде.Перейдите по ссылке в URL-адресе ниже и перейдите к заголовкам «Спецификации» и «Совместимость браузера» для получения дополнительной информации о том, где он находится.
Цитата: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
Хотите примеры? Перейдите по ссылке, которую я разместил, там есть все.
источник
Теперь он имеет полную поддержку в последних версиях основных браузеров, таких как Chrome, Edge, Firefox, Safari и т. Д. Вот сравнение между нулевым оператором и нулевым оператором слияния
источник