Pertanyaan Apakah ada operator “penggabungan nol” di JavaScript?


Apakah ada operator penggabungan nol di Javascript?

Misalnya, dalam C #, saya bisa melakukan ini:

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

Aproksimasi terbaik yang bisa saya cari untuk Javascript adalah menggunakan operator kondisional:

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

Yang agak IMHO icky. Bisakah saya melakukan lebih baik?


968
2018-01-24 18:18


asal


Jawaban:


The JavaScript setara dengan operator penggabungan C # null (??) menggunakan logika OR (||):

var whatIWant = someString || "Cookies!";

Ada beberapa kasus (diklarifikasi di bawah) bahwa perilaku tidak akan cocok dengan C #, tetapi ini adalah cara umum, singkat untuk menetapkan nilai default / alternatif dalam JavaScript.


Klarifikasi

Terlepas dari jenis operan pertama, jika mentransmisikannya ke hasil Boolean false, penugasan akan menggunakan operan kedua. Waspadai semua kasus di bawah ini:

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

Ini berarti:

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"

1565
2018-01-24 18:25



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

solusi ini berfungsi seperti fungsi penggabungan SQL, ia menerima sejumlah argumen, dan mengembalikan null jika tidak ada yang memiliki nilai. Berperilaku seperti C # ?? operator dalam arti bahwa "", salah, dan 0 dianggap TIDAK NULL dan karenanya dianggap sebagai nilai yang sebenarnya. Jika Anda berasal dari latar belakang .net, ini akan menjadi solusi perasaan yang paling alami.


56
2018-03-08 05:24



Jika || sebagai pengganti C # ?? tidak cukup baik dalam kasus Anda, karena menelan string kosong dan nol, Anda selalu dapat menulis fungsi Anda sendiri:

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

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

38
2018-01-24 18:45



Tidak ada yang menyebutkan potensi di sini NaN, yang - bagi saya - juga merupakan nilai null-ish. Jadi, saya pikir saya akan menambahkan dua sen saya.

Untuk kode yang diberikan:

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

Jika Anda menggunakan || operator, Anda mendapatkan nilai non-palsu pertama:

var result = a || b || c || d || e || f; // result === 1

Jika Anda menggunakan metode penggabungan umum, seperti yang diposting di sini, kamu akan mendapatkan c, yang memiliki nilai: NaN

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

Bukan keduanya ini sepertinya benar bagi saya. Dalam dunia kecil saya yang menyatu dengan logika, yang mungkin berbeda dari dunia Anda, saya menganggap tidak terdefinisi, null, dan NaN sebagai "nol-ish". Jadi, saya berharap untuk kembali d (nol) dari metode penggabungan.

Jika otak siapa pun berfungsi seperti otak Anda, dan Anda ingin mengecualikannya NaN, maka metode ini akan mencapai itu:

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;
}

Bagi mereka yang menginginkan kode sependek mungkin, dan tidak keberatan sedikit kurang kejelasan, Anda juga dapat menggunakan ini seperti yang disarankan oleh @ pemain bola. Ini mengambil keuntungan dari fakta bahwa NaN tidak pernah sama dengan NaN. Anda dapat membaca lebih lanjut tentang itu di sini: Mengapa NaN tidak sama dengan 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;
}

10
2018-05-26 21:07



Saat ini tidak ada dukungan, tetapi proses JS-standarisasi bekerja di atasnya: https://github.com/tc39/proposal-optional-chaining


6
2017-07-16 21:17



Ya, itu akan segera datang. Lihat proposal di sini dan status implementasi di sini.

Terlihat seperti ini:

x ?? y

Contoh

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

5
2018-05-07 09:32



hati-hati terhadap definisi khusus JavaScript dari nol. ada dua definisi untuk "tidak ada nilai" di javascript. 1. Null: ketika sebuah variabel adalah null, artinya tidak mengandung data di dalamnya, tetapi variabel sudah didefinisikan dalam kode. seperti ini:

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

dalam hal demikian, jenis variabel Anda sebenarnya adalah Objek. menguji.

window.alert(typeof myEmptyValue); // prints Object
  1. Undefined: ketika variabel belum didefinisikan sebelumnya dalam kode, dan seperti yang diharapkan, itu tidak mengandung nilai apa pun. seperti ini:

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

jika seperti itu, jenis variabel Anda adalah 'tidak terdefinisi'.

perhatikan bahwa jika Anda menggunakan operator perbandingan jenis-konversi (==), JavaScript akan bertindak sama untuk kedua nilai kosong ini. untuk membedakannya, selalu gunakan operator perbandingan ketat jenis (===).


4
2018-01-24 18:35



Setelah membaca klarifikasi Anda, jawaban @Ates Goral menyediakan cara melakukan operasi yang sama dengan yang Anda lakukan di C # dalam JavaScript.

Jawaban @ Gumbo memberikan cara terbaik untuk memeriksa nol; Namun, penting untuk dicatat perbedaannya == melawan === di JavaScript terutama ketika datang ke masalah pemeriksaan undefined dan / atau null.

Ada artikel yang sangat bagus tentang perbedaan dalam dua istilah sini. Pada dasarnya, pahamilah jika Anda menggunakannya == dari pada ===, JavaScript akan mencoba untuk menyatukan nilai-nilai yang Anda bandingkan dan mengembalikan apa hasil perbandingannya setelah perpaduan ini.


3
2018-01-24 18:23