質問

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

たとえば、C# では次のことができます。

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

Javascript に関して私が理解できる最良の近似は、条件演算子を使用することです。

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

これは私見ではちょっと不快です。もっと上手くできるでしょうか?

役に立ちましたか?

解決

C#のヌル合体オペレータのJavaScriptの等価(??)を使用している論理OR(||):

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"

他のヒント

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のCOALESCE関数のように動作し、それは、任意の数の引数を受け取り、それらのどれもが値を持っていない場合はnullを返します。これは、C#のように振る舞います? 「」、偽、0がNOT NULLと考えられ、したがって、など実際の値をカウントしているという意味で演算子。あなたは.NETの背景から来ている場合、これが最も自然な感じのソリューションとなります。

C#の||それは空の文字列とゼロを飲み込んだので、あなたは常に自分自身の関数を書くことができ、あなたのケースでは十分ではありませんの代替として??の場合

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

 var whatIWant = $N(someString, 'Cookies!');

はい、もうすぐです。見る ここで提案 そして 導入状況はこちら.

次のようになります。

x ?? y

const response = {
  settings: {
    nullValue: null,
    height: 400,
    animationDuration: 0,
    headerText: '',
    showSplashScreen: false
  }
};

const undefinedValue = response.settings?.undefinedValue ?? 'some other default'; // result: 'some other default'
const nullValue = response.settings?.nullValue ?? 'some other default'; // result: 'some other default'
const headerText = response.settings?.headerText ?? 'Hello, world!'; // result: ''
const animationDuration = response.settings?.animationDuration ?? 300; // result: 0
const showSplashScreen = response.settings?.showSplashScreen ?? true; // result: false

誰もが、ここでNaNの可能性を言及しなかったた - 私に - もヌルっぽい値です。だから、私は、二セントを追加したいと思っています。

与えられたコードの場合:

var a,
    b = null,
    c = parseInt('Not a number'),
    d = 0,
    e = '',
    f = 1
;

あなたは||演算子を使用した場合、あなたは最初の非偽の値を取得します:

var result = a || b || c || d || e || f; // result === 1
あなたは典型的な合体方法を使用する場合は、

、ここの掲示などのは、あなたが値を持つ、c取得します:d

var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
これらの

どちらの右の私には思えます。あなたの世界とは異なる場合が合体ロジック、の私自身の小さな世界では、私はすべてが「ヌルっぽい」など、未定義のヌル、およびNaNを検討してください。だから、私は、合体方法から<=>バック(ゼロ)を取得することを期待する。

誰の脳は私のように動作します、そしてあなたが<=>除外したい場合は、この方法は、それを達成します。

function coalesce() {
    var i, undefined, arg;

    for( i=0; i < arguments.length; i++ ) {
        arg = arguments[i];
        if( arg !== null && arg !== undefined
            && (typeof arg !== 'number' || arg.toString() !== 'NaN') ) {
            return arg;
        }
    }
    return null;
}
@impinballによって示唆されているように、

できるだけコードは限り短くしたい、と明確さの少し不足を気にしない人のために、あなたもこれを使用することができます。これはNaNにはNaNに決して同じであるという事実を利用します。あなたはここでその上より最大読むことができます:なぜNaNはNaNに等しくありません<? />

function coalesce() {
    var i, arg;

    for( i=0; i < arguments.length; i++ ) {
        arg = arguments[i];
        if( arg != null && arg === arg ) { //arg === arg is false for NaN
            return arg;
        }
    }
    return null;
}

ことに留意してくださいJavaScriptの特定の定義はnullになります。が定義は"価値"を設定しています1.Nullの場合:時の変数がnullの場合で含んでおりませんので、データそれなりですが、変数が定められています。このように:

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法等の空値です。として使用してください型の厳密な比較演算子(===).

あなたの明確化を読んだ後、@Ates Goralの答えは、JavaScriptでのC#でやって同じ操作を実行する方法を提供しています。

ガンボの答え@ヌルをチェックするための最良の方法を提供します。しかし、それがために==および/または===チェックの問題になるとJavaScriptでの、特にundefinednullの違いに注意することが重要です。

ここでは二つの用語の違いについては本当に良い記事があります。基本的に、あなたは<=>代わり<=>の使用している場合は、JavaScriptを使用して、比較している値を合体して返すようにしようとすることを理解しどのようなのこの合体後の比較の結果。

JSは現在、null合体演算子を得ています! 現在、ステージ3のステージ-4へ移動、イェーイ! https://github.com/tc39/proposal-nullish-coalescingする

提案の例:

const response = {
  settings: {
    nullValue: null,
    height: 400,
    animationDuration: 0,
    headerText: '',
    showSplashScreen: false
  }
};

const undefinedValue = response.settings.undefinedValue ?? 'some other default'; // result: 'some other default'
const nullValue = response.settings.nullValue ?? 'some other default'; // result: 'some other default'
const headerText = response.settings.headerText ?? 'Hello, world!'; // result: ''
const animationDuration = response.settings.animationDuration ?? 300; // result: 0
const showSplashScreen = response.settings.showSplashScreen ?? true; // result: false
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top