Есть ли & ldquo; null coalescing & rdquo; оператор в JavaScript?

Есть ли в Javascript нулевой оператор слияния?

Например, в C # я могу сделать это:

String someString = null;
var whatIWant = someString ?? "Cookies!";

Лучшее приближение, которое я могу выяснить для Javascript, это использовать условный оператор:

var someString = null;
var whatIWant = someString ? someString : 'Cookies!';

Что-то вроде ИМХО. Могу ли я сделать лучше?

1232
задан 13.05.2020, 02:33

4 ответа

JavaScript, эквивалентный из пустого оператора (??) объединения C#, использует логическое ИЛИ (||):

var whatIWant = someString || "Cookies!";

существуют случаи (разъясненный ниже), что поведение не будет соответствовать поведению C#, но это - общий, краткий способ присвоить значения по умолчанию/альтернативные в JavaScript.

<час>

Разъяснение

Независимо от типа первого операнда, при кастинге его к булевской переменной приводит к false, присвоение будет использовать второй операнд. Остерегайтесь всех случаев ниже:

alert(Boolean(null)); // false
alert(Boolean(undefined)); // false
alert(Boolean(0)); // false
alert(Boolean("")); // false
alert(Boolean("false")); // true -- gotcha! :)

Это означает:

var whatIWant = null || new ShinyObject(); // is a new shiny object
var whatIWant = undefined || "well defined"; // is "well defined"
var whatIWant = 0 || 42; // is 42
var whatIWant = "" || "a million bucks"; // is "a million bucks"
var whatIWant = "false" || "no way"; // is "false"
1924
ответ дан 13.05.2020, 02:36
  • 1
    Знаменитый то, что || возвраты первый " truey" значение или последний " falsey" один (если ни один не может оценить к истинному), и что && работы противоположным способом: возврат последнего значения truey или первого falsey один. – Justin Johnson 13.05.2020, 02:37
  • 2
    @Ates Goral: +1 и Array.prototype.forEach = Array.prototype.forEach || функция (... ЧТО? – Marco Demaio 13.05.2020, 02:38
  • 3
    Строки как " false" " undefined" " null" " 0" " empty" " deleted" все верны, так как они - непустые строки. – some 13.05.2020, 02:38

Если ||, поскольку замена C# ?? не достаточно хороша в Вашем случае, потому что это глотает пустые строки и нули, можно всегда писать собственную функцию:

 function $N(value, ifnull) {
    if (value === null || value === undefined)
      return ifnull;
    return value;
 }

 var whatIWant = $N(someString, 'Cookies!');
43
ответ дан 13.05.2020, 02:34
  • 1
    @Flexo: Сообщение отредактировало, чтобы отразить, что и поощряют принятие другого ответа. –  27.03.2020, 17:11
  • 2
    Я думаю, что мог бы на самом деле предпочесть определять функцию, которая возвращается false если (строго) пустой/неопределенный и true иначе - использование это с логическим или; это могло быть более читаемо, чем много вызовов вложенных функций. например, $N(a) || $N(b) || $N(c) || d более читаемо, чем $N($N($N(a, b), c), d). – Bob 13.05.2020, 02:34
  • 3
    предупреждение (пустой указатель || ' ') все еще предупреждает пустую строку, и я думаю, что мне на самом деле нравится это предупреждение (' ' || ' blah') предупреждает вздор, а не пустую строку - хороший для знания хотя! (+1) – Daniel Schaffer 13.05.2020, 02:35

После чтения Вашего разъяснения, @Ates ответ Goral обеспечивает, как выполнить ту же операцию, которую Вы делаете в C# в JavaScript.

ответ @Gumbo обеспечивает лучший способ проверить на пустой указатель; однако, важно отметить различие в == по сравнению с === в JavaScript особенно когда дело доходит до проблем проверки undefined и/или null.

существует действительно хорошая статья о различии в двух условиях здесь . В основном поймите, что, если Вы используете == вместо ===, JavaScript попытается объединить значения, которые Вы сравниваете и возвращаете что результат сравнения после эта коалесценция.

3
ответ дан 13.05.2020, 02:37
  • 1
    Вещи, которые прослушивали меня о той статье (и Jash), неопределенное window.hello свойство, оцениваемое к пустому указателю по некоторым причинам. Это должно быть не определено вместо этого. Попробуйте его ошибочная консоль Firefox и лично убедитесь. – Ates Goral 13.05.2020, 02:37

остерегайтесь JavaScript определенного определения пустого указателя. существует два определения для "никакого значения" в JavaScript. 1. Пустой указатель: когда переменная является пустой, это означает, что это не содержит данных в нем, но переменная уже определяется в коде. как это:

var myEmptyValue = 1;
myEmptyValue = null;
if ( myEmptyValue === null ) { window.alert('it is null'); }
// alerts

в таком случае, типом Вашей переменной является на самом деле Объект. протестируйте его.

window.alert(typeof myEmptyValue); // prints Object
  1. Неопределенный: когда переменная не была определена, прежде в коде, и как ожидалось, она не содержит значения. как это:

    if ( myUndefinedValue === undefined ) { window.alert('it is undefined'); }
    // alerts
    

, если такой случай, тип Вашей переменной 'не определен'.

уведомление, что при использовании преобразовывающего тип оператора сравнения (==) JavaScript будет действовать одинаково обоих из этих пустых значений. для различения их всегда используйте строгий типом оператор сравнения (===).

4
ответ дан 13.05.2020, 02:38
  • 1
    +1 - Это также зависит от способа, которым это выполняется, Т.Е. Вы can' t объявляют, поскольку #!/bin/bash тогда вызывают с sh Или объявляют как #!/bin/sh и вызывают с bash, по крайней мере, на Debian 7 Вы будете видеть ошибку на обоих. Объявление должно соответствовать вызову. – webLacky3rdClass 13.12.2013, 21:03
  • 2
    Фактическое различие между объявляемой переменной или нет: предупреждение (window.test)/*undefined*/; предупреждение (" test" в окне)/*false*/; window.test = неопределенный; предупреждение (window.test)/*undefined*/; предупреждение (" test" в окне)/*true*/; для (var p в окне) {/*p может быть " test" */} – Ates Goral 13.05.2020, 02:39
  • 3
    На самом деле пустой указатель является значением. It' s специальное значение текстового объекта. Переменная, устанавливаемая аннулировать средства, это содержит данные, данные, являющиеся ссылкой на несуществующий объект. Переменная может быть определена со значением, неопределенным в Вашем коде. Это не то же как переменная не быть объявленным. – Ates Goral 13.05.2020, 02:39

Теги

Похожие вопросы