Ruby || = (atau sama dengan) di JavaScript?


128

Saya suka ||=mekanisme Ruby . Jika variabel tidak ada atau ada nil, buatlah dan setel sama dengan sesuatu:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

Saya perlu melakukan sesuatu yang serupa di JavaScript sekarang. Apa konvensi atau cara yang tepat untuk melakukan ini? Saya tahu ||=itu bukan sintaks yang valid. 2 cara yang jelas untuk menanganinya adalah:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};

Jawaban:


152

Keduanya benar-benar benar, tetapi jika Anda mencari sesuatu yang berfungsi seperti ||=di ruby. Metode pertama yang variable = variable || {}Anda cari :)


1
Hati-hati menggunakan ini jika nilai yang valid xadalah falsy, like false, dan Anda hanya ingin menyetel default saat xtidak ditentukan.
Joshua Pinter

komentar di atas benar. Mengambil contoh kasus Anda, ini tidak akan bekerja dengan cara yang sama di JS. let amount = 0;diikuti oleh amount = amount || 5 akan berubah menjadi 5. Jika Anda tidak ingin hal itu terjadi gunakan ??operator sebagai gantinya ||.
AshwinKumarS

@AshwinKumarS Atau cukup gunakan amount ??= 5;.
user4642212

@ user4642212 Saya tidak berpikir bahwa sintaks bekerja di JS, bukan?
AshwinKumarS

@AshwinKumarS Ya, benar. Lihat dokumentasi , spesifikasi , proposal .
user4642212

22

Anda dapat menggunakan operator OR logis ||yang mengevaluasi operan kanannya jika lValnilai salah.

Nilai-nilai yang salah termasuk misalnya null, false, 0, "", undefined, NaN

x = x || 1

Hati-hati menggunakan ini jika nilai yang valid xadalah falsy, like false, dan Anda hanya ingin menyetel default saat xtidak ditentukan.
Joshua Pinter

4

Jika Anda bekerja dengan objek, Anda dapat menggunakan destructuring (sejak ES6) seperti ini:

({ myLib: window.myLib = {} } = window);

... tetapi Anda tidak mendapatkan apa-apa atas jawaban yang diterima kecuali kebingungan.


1
"tetapi Anda tidak mendapatkan apa-apa atas jawaban yang diterima kecuali kebingungan" - bagus. :)
lindes

Saya yakin seseorang akan menganggap ini sebagai alasan untuk membenci javascript
Volper


-1

Ruby || = tugas hubung singkat operator. Ini dapat dianggap seperti ini:

return a || a = b

Jadi di javascript, ini terlihat sangat mirip:

return a || (a = b);

Namun, tampaknya seperti yang ditunjukkan pada komentar di bawah, bentuk literal ruby ​​ini kurang efisien dibandingkan dengan idiom javascript standar a = a || b.

Untuk referensi: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


1
Dalam praktiknya, tampaknya a = a || bbentuknya lebih optimal jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

ah alat yang keren. bagaimana jadinya jika x memiliki nilai dan jadi hubung singkat?
chris

Saya percaya pembongkaran harus eksplisit pada jsperf sehingga tes ini harus menunjukkan kinerja korsleting. Dugaan saya adalah bahwa V8 memiliki pengoptimalan khusus untuk formulirnya a = a || b.
jchook

3
FYI Sepertinya apa pun perbedaan yang ada sekarang telah dioptimalkan.
Charles Wood

a || (a = b)memiliki semantik yang benar untuk menyimpulkan nama fungsi. Saat ini sedang dalam diskusi untuk proposal baru.
user4642212

-1

Anda dapat mencapai perilaku yang diinginkan menggunakan | = operator di javascript hanya untuk bilangan bulat. Tetapi Anda harus mendefinisikan variabel terlebih dahulu.

let a = 0
a |= 100
console.log(a) // 100

Untuk benda

let o = {}
o.a |= 100
console.log(o) // {a: 100}

Untuk Array

let arr = []
arr[0] |= 100
console.log(arr) // [100]

Pertanyaannya bukan tentang |atau |=. Perilaku yang diinginkan dalam pertanyaan tidak terkait dengan operasi bitwise.
pengguna4642212

Anda benar, saya akan mengedit jawabannya sesuai
wallgeek

Diedit. Saya harap ini masuk akal sekarang.
wallgeek
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.