1514

Javascriptにnull合体演算子はありますか?

たとえば、C# では次のようにできます。

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

Javascript について私が把握できる最良の概算は、条件演算子を使用することです。

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

これはちょっと厄介な私見です。私はもっ​​とうまくやれるだろうか?

4

17 に答える 17

2272

アップデート

JavaScript はnullish 合体演算子 (??)をサポートするようになりました。左側のオペランドがnullorundefinedの場合は右側のオペランドを返し、それ以外の場合は左側のオペランドを返します。

古い回答

ご使用前に互換性をご確認ください。


C# の null 合体演算子 ( ) に相当する JavaScript??は、論理 OR ( ||)を使用しています。

var whatIWant = someString || "Cookies!";

動作が C# の動作と一致しない場合がありますが (以下で説明)、これは JavaScript で既定値/代替値を割り当てる一般的で簡潔な方法です。


明確化

最初のオペランドの型に関係なく、それをブール値にキャストした結果が のfalse場合、代入では 2 番目のオペランドが使用されます。以下のすべてのケースに注意してください。

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"
于 2009-01-24T18:25:31.133 に答える
81
function coalesce() {
    var len = arguments.length;
    for (var i=0; i<len; i++) {
        if (arguments[i] !== null && arguments[i] !== undefined) {
            return arguments[i];
        }
    }
    return null;
}

var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);

// xyz.val now contains 5

このソリューションは、SQL 合体関数のように機能し、任意の数の引数を受け入れ、値がない場合は null を返します。C# のように動作しますか?? ""、false、および 0 は NOT NULL と見なされるため、実際の値としてカウントされるという意味での演算子です。.net のバックグラウンドを持っている場合、これが最も自然な解決策になります。

于 2014-03-08T05:24:46.097 に答える
46

||空の文字列とゼロを飲み込むため、C#の代わりとして十分ではない場合??は、いつでも独自の関数を作成できます。

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

 var whatIWant = $N(someString, 'Cookies!');
于 2009-01-24T18:45:42.230 に答える
7

論理的な無効化代入、2020+ ソリューション

現在、新しい演算子 がブラウザに追加されています??=。これは、null 合体演算子??と代入演算子を組み合わせたもの=です。

注: これは、パブリック ブラウザー バージョンではまだ一般的ではありません。空き状況が変わると更新されます。

??=変数が未定義または null であるかどうかをチェックし、既に定義されている場合はショートサーキットします。そうでない場合は、右側の値が変数に割り当てられます。

基本的な例

let a          // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

オブジェクト/配列の例

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

ブラウザ サポート2022 年 1 月 - 89%

Mozilla ドキュメント

于 2020-07-09T22:00:47.703 に答える
6

はい、その提案は現在ステージ 4です。これは、提案が正式な ECMAScript 標準に含まれる準備ができていることを意味します。Chrome、Edge、Firefox の最近のデスクトップ バージョンでは既に使用できますが、この機能がクロス ブラウザーの安定性に達するまで、もう少し待つ必要があります。

次の例を見て、その動作を示します。

// note: this will work only if you're running latest versions of aforementioned browsers
const var1 = undefined;
const var2 = "fallback value";

const result = var1 ?? var2;
console.log(`Nullish coalescing results in: ${result}`);

前の例は次と同等です。

const var1 = undefined;
const var2 = "fallback value";

const result = (var1 !== null && var1 !== undefined) ?
    var1 :
    var2;
console.log(`Nullish coalescing results in: ${result}`);

Null 合体は、オペレーターが行ったようにの値を脅かさないことに注意してください(または値のみをチェックします)。したがって、次のスニペットは次のように動作します。||undefinednull

// note: this will work only if you're running latest versions of aforementioned browsers
const var1 = ""; // empty string
const var2 = "fallback value";

const result = var1 ?? var2;
console.log(`Nullish coalescing results in: ${result}`);


TypeScriptユーザーの場合、TypeScript 3.7以降、この機能も利用できるようになりました。

于 2020-03-26T18:56:24.660 に答える
5

JavaScript固有のnullの定義に注意してください。javascriptの「値なし」には2つの定義があります。1. Null:変数がnullの場合、データが含まれていないことを意味しますが、変数はコードですでに定義されています。このような:

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

このような場合、変数のタイプは実際にはObjectです。試して。

window.alert(typeof myEmptyValue); // prints Object
  1. 未定義:変数がコード内で以前に定義されておらず、予想どおり、値が含まれていない場合。このような:

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

そのような場合、変数のタイプは「未定義」です。

タイプ変換比較演算子(==)を使用すると、JavaScriptはこれらの空の値の両方に対して同等に機能することに注意してください。それらを区別するには、常にtype-strict比較演算子(===)を使用します。

于 2009-01-24T18:35:39.287 に答える
5

説明を読んだ後、@Ates Goral の回答では、C# で行っているのと同じ操作を JavaScript で実行する方法が提供されています。

@Gumboの答えは、nullをチェックする最良の方法を提供します。ただし、特におよび/またはのチェックの問題に関しては、JavaScript==との違いに注意することが重要です。===undefinednull

2 つの用語の違いに関する非常に優れた記事がここにあります。基本的に、==の代わりにを使用すると、JavaScript は比較している値を合体させようとし、この合体===に比較の結果を返すことを理解してください。

于 2009-01-24T18:23:21.900 に答える