Menurut ECMA-262, bagian 11.13, berikut adalah daftar lengkap dari operator penugasan senyawa: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
Menurut bagian 11.11, var c = a || b
akan memasukkan a
nilai ke dalam c
jika ToBoolean(a)
benar dan akan memasukkan b
nilai ke dalam c
sebaliknya. Dengan demikian, logika OR sering digunakan sebagai operator gabungan, misalnya
function (options) {
options = options || {};
}
Cukup sering, menyatu digunakan untuk menentukan nilai default untuk variabel, seperti yang ditunjukkan di atas: a = a || b
.
Tampaknya operator penugasan senyawa ||=
akan sangat berguna, yang memungkinkan untuk menulis kode di atas secara lebih pendek dan lebih bersih: a ||= b
. Namun, tidak ada di sana (meskipun *=
, +=
dan operator penugasan majemuk lainnya).
Pertanyaannya adalah, mengapa?
javascript
language-design
history
penartur
sumber
sumber
+=
,*=
,-=
,/=
, kenapa tidak%=
bekerja?).angle %= 360
atauvertexIndex %= numberOfVertices
(untuk daftar titik dari poligon tertutup).||=
dan&&=
akan segera hadir: "Anda mungkin senang mengetahui bahwa untuk JS2 / ES4, || = dan && = ditambahkan juga. || = yang paling banyak berguna dari keduanya tetapi tidak ada alasan untuk meninggalkan tugas-op bentuk && keluar. " .Jawaban:
Salah satu alasan yang mungkin adalah bahwa operator logis
&&
dan||
memiliki perilaku "korsleting". Operan tangan kanan&&
dan||
tidak dievaluasi kecuali perlu. Mungkin karena alasan ini perancang bahasa memutuskan bahwa makna ekspresi sepertia ||= f()
itu tidak jelas, sehingga operator seperti itu lebih baik ditinggalkan.sumber
a ||= b
harus ditafsirkana = a || b
, tetapi sebenarnya bisaa || a = b
(seperti di Ruby ). Mereka mungkin berbeda jika setter memiliki efek samping. Memilih satu mungkin buruk bagi pengguna di kamp lain. Saya pribadi sukaa || a = b
caranya (cara Ruby), tetapi saya tidak yakin apakah semua orang senang dengan itu.Jawaban umum untuk semua pertanyaan tentang "mengapa fitur bahasa ini tidak diterapkan" adalah bahwa tim yang merancang bahasa memutuskan bahwa manfaatnya tidak melebihi biaya.
Biaya dapat mengambil banyak bentuk. Dibutuhkan waktu dan upaya untuk mengimplementasikan fitur bahasa, tetapi ada juga biaya intrinsik kompleksitas: apakah fitur membuat bahasa lebih kompleks atau ambigu, tidak sebanding dengan manfaat potensialnya?
||=
Operator hipotetis melakukan sesuatu yang secara fundamental berbeda dari operator penugasan majemuk lainnya. Sementara operator lain bersifat matematika murni, operator ini berbeda: ia menggantikan satu nilai dengan yang lain (dalam konteks yang Anda jelaskan).Mengingat ini ambiguitas (operator melakukan dua fungsi yang berbeda, tergantung pada konteksnya), tidak sulit untuk melihat mengapa itu tidak termasuk dalam bahasa. Meskipun Anda menyatakan perubahan itu
untuk
untuk melakukan null coalescing adalah fitur yang berharga, manfaatnya jauh lebih tidak jelas bagi saya. Jika substitusi nilai terjadi, tampaknya logis (dan lebih jelas) untuk memiliki kedua nilai di sisi kanan tanda sama dengan, untuk memberikan indikasi visual bahwa substitusi tersebut dapat terjadi.
C # mengambil jalur yang berbeda, dan menggunakan operator khusus untuk penggabungan nol.
sumber
foo = foo || bar
mengharuskan Anda mengetikfoo
dua kali. Ini rumit dan juga rentan terhadap pengetikan ulang kesalahan ketik.||=
sebagai operator penggabungan nol tidak intuitif dan pada kenyataannya terlihat tumpul dalam bentuk kode. Di mana itu menjadi berguna adalah ketika Anda mencoba melakukan matematika boolean.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Anda benar itu
||=
adalah konstruksi yang berguna. Itu ada di Perl.Faktanya, Perl menyediakan semua ini :
Beberapa di antaranya sangat bagus (
.=
menambahkan sesuatu ke akhir string), yang lain kurang begitu (&&=
??? Saya kira variabel akan diatur ke sisi kanan jika keduanya dan variabel benar. Tapi mengapa Anda pernah melakukan ini ?)Apa yang termasuk dalam bahasa sebenarnya adalah fitur dari filosofi desainnya.
sumber
&&=
artinya / tidak.