Dengan cuplikan JavaScript ini ...
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
alert(f); // 4
Dapatkah seseorang tolong jelaskan kepada saya apa yang disebut teknik ini (tebakan terbaik saya ada pada judul pertanyaan ini!)? Dan bagaimana / mengapa itu bekerja dengan tepat?
Pemahaman saya adalah bahwa variabel f
akan diberi nilai terdekat (dari kiri ke kanan) dari variabel pertama yang memiliki nilai yang tidak nol atau tidak terdefinisi, tetapi saya belum berhasil menemukan banyak bahan referensi tentang teknik ini dan memiliki melihatnya digunakan banyak.
Juga, apakah teknik ini khusus untuk JavaScript? Saya tahu melakukan sesuatu yang serupa di PHP akan menghasilkan f
memiliki nilai boolean yang benar, bukan nilai d
itu sendiri.
$f=$a or $f=$b or $f=$c; // etc
. PHP memiliki||
operator danor
operator, yang melakukan pekerjaan yang sama; Namunor
dievaluasi setelah penugasan sementara||
dievaluasi sebelumnya. Ini juga memberi Anda gaya bahasa Inggris$a=getSomething() or die('oops');
$f = $a ?: $b ?: $c;
??
ini.$a = $b ?? 'default'
$a
akan diberi nilai$b
jika$b
benar, yang lain'default'
?Jawaban:
Lihat evaluasi hubung singkat untuk penjelasannya. Ini adalah cara umum untuk menerapkan operator ini; itu tidak unik untuk JavaScript.
sumber
if( true == f )
. Jika bilangan bulat disimpan dalam f, maka tes ini akan selalu mengembalikan false.if(true == f)
, yang sama denganif(f)
: tes akan berlalu. Jika Anda ingin juga menguji jenis darif
, menggunakan perbandingan yang ketat:if(true === f)
, yang akan gagal memang.Ini dibuat untuk menetapkan nilai default , dalam hal ini nilai
y
, jikax
variabel falsy .Operator boolean dalam JavaScript dapat mengembalikan operan, dan tidak selalu menghasilkan boolean seperti dalam bahasa lain.
Operator Logical OR (
||
) mengembalikan nilai operan kedua, jika yang pertama palsu, jika tidak nilai operan pertama dikembalikan.Sebagai contoh:
Falsy nilai-nilai adalah mereka yang memaksa untuk
false
ketika digunakan dalam konteks boolean, dan mereka0
,null
,undefined
, string kosong,NaN
dan tentu sajafalse
.sumber
||
eksklusif.&&
operator memiliki perilaku yang sama, ia mengembalikan nilai dari operan pertama jika itu dengan sendirinya falsy dan mengembalikan nilai dari operan kedua, hanya jika yang pertama adalah truthy , misalnya("foo" && "bar") == "bar"
, dan(0 && "bar") == 0
Javacript menggunakan evaluasi hubung singkat untuk operator logis
||
dan&&
. Namun, ini berbeda dengan bahasa lain karena mengembalikan hasil dari nilai terakhir yang menghentikan eksekusi, bukan nilaitrue
, ataufalse
.Nilai-nilai berikut ini dianggap salah dalam JavaScript.
""
(string kosong)Mengabaikan aturan prioritas operator , dan menjaga hal-hal sederhana, contoh-contoh berikut menunjukkan nilai mana yang menghentikan evaluasi, dan dikembalikan sebagai hasilnya.
5 nilai pertama hingga
NaN
palsu sehingga mereka semua dievaluasi dari kiri ke kanan, sampai memenuhi nilai kebenaran pertama -"Hello"
yang membuat seluruh ekspresi benar, jadi apa pun yang lebih jauh ke atas tidak akan dievaluasi, dan"Hello"
akan dikembalikan sebagai hasil dari ekspresi . Demikian pula, dalam hal ini:5 nilai pertama semuanya benar dan dievaluasi sampai memenuhi nilai falsy pertama (
null
) yang membuat ekspresi salah, jadi2010
tidak dievaluasi lagi, dannull
dikembalikan sebagai hasil dari ekspresi.Contoh yang Anda berikan adalah memanfaatkan properti JavaScript ini untuk melakukan tugas. Ini dapat digunakan di mana saja di mana Anda perlu mendapatkan nilai true atau falsy pertama di antara seperangkat nilai. Kode ini di bawah ini akan menetapkan nilai
"Hello"
untukb
karena membuat lebih mudah untuk menetapkan nilai default, bukannya melakukan jika-lain cek.Anda dapat menyebut contoh di bawah ini sebagai eksploitasi fitur ini, dan saya percaya ini membuat kode lebih sulit dibaca.
Di dalam lansiran, kami memeriksa apakah
messages
ada kesalahan, dan jika ya, maka evaluasi dan kembalinoNewMessagesText
, jika tidak, evaluasi dan kembalinewMessagesText
. Karena itu salah dalam contoh ini, kami berhenti di noNewMessagesText dan memberitahukan"Sorry, you have no new messages."
.sumber
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
Variabel Javascript tidak diketik, sehingga f dapat diberi nilai integer meskipun telah ditetapkan melalui operator boolean.
f diberi nilai terdekat yang tidak setara dengan false . Jadi 0, false, null, undefined, semuanya dilewati:
sumber
''
juga sama salah dalam hal ini.f is assigned the NEAREST value
yang cukup penting di sini.||
Operator boolean , menjadi operator boolean memiliki dua operan: sisi kiri dan sisi kanan. Jika sisi kiri||
adalah truthy , yang resolve operasi ke sisi kiri dan sisi kanan diabaikan. Jika sisi kiri adalah kepalsuan , ia memutuskan ke sisi kanan. Jadinull || undefined || 4 || 0
benar-benar memutuskanundefined || 4 || 0
yang memutuskan untuk4 || 0
yang memutuskan untuk4
.Tidak ada keajaiban untuk itu. Ekspresi Boolean suka
a || b || c || d
dievaluasi dengan malas. Interpeter mencari nilaia
, itu tidak terdefinisi sehingga salah sehingga bergerak, kemudian melihatb
yang nol, yang masih memberikan hasil palsu sehingga bergerak, lalu melihatc
- cerita yang sama. Akhirnya ia melihatd
dan berkata 'huh, ini bukan nol, jadi saya mendapatkan hasil saya' dan menetapkannya ke variabel akhir.Trik ini akan bekerja dalam semua bahasa dinamis yang melakukan evaluasi hubung singkat ekspresi boolean. Dalam bahasa statis itu tidak akan dikompilasi (ketik kesalahan). Dalam bahasa yang ingin mengevaluasi ekspresi boolean, itu akan mengembalikan nilai logis (yaitu benar dalam kasus ini)
sumber
d
akan ditetapkan apakah itu null / tidak terdefinisi atau tidak.||
operator selalu memutuskan untuk seluruh operan sisi kanan ketika sisi kiri falsy. Menjadi operator boolean hanya melihat dua input: sisi kiri dan sisi kanan. Pengurai tidak melihat mereka sebagai serangkaian istilah, jadi itu tidak benar-benar berhenti ketika menemukan nilai kebenaran pertama kecuali jika nilai itu juga merupakan operan tangan kiri dari yang lain||
.Pertanyaan ini sudah menerima beberapa jawaban bagus.
Singkatnya, teknik ini memanfaatkan fitur bagaimana bahasa dikompilasi. Artinya, JavaScript "sirkuit pendek" evaluasi operator Boolean dan akan mengembalikan nilai yang terkait dengan nilai variabel non-false pertama atau apa pun yang berisi variabel terakhir. Lihat penjelasan Anurag tentang nilai-nilai yang akan dinilai salah.
Menggunakan teknik ini bukan praktik yang baik karena beberapa alasan; namun.
Fitur yang Didokumentasikan: Ada alternatif yang ada yang memenuhi kebutuhan ini dan konsisten di lebih banyak bahasa. Ini akan menjadi operator ternary:
()? nilai 1: Nilai 2.
Menggunakan operator ternary memang membutuhkan pengetikan yang lebih sedikit, tetapi ia dengan jelas membedakan antara ekspresi Boolean yang dievaluasi dan nilai yang diberikan. Selain itu dapat dirantai, sehingga jenis tugas default yang dilakukan di atas dapat dibuat kembali.
sumber
potentially be targeted for change in the future.
ya, tapi saya tidak menggunakannya untuk javascript.a || b || c || d || e
?Kembalikan nilai asli pertama .
Jika semuanya false, kembalikan nilai false terakhir.
Contoh:-
sumber
Ini mengatur variabel baru (
z
) ke nilaix
apakah itu "benar" (bukan nol, objek / array / fungsi yang valid / apa pun itu) atauy
sebaliknya. Ini adalah cara yang relatif umum untuk memberikan nilai default jikax
tidak ada.Misalnya, jika Anda memiliki fungsi yang mengambil parameter panggilan balik opsional, Anda bisa memberikan panggilan balik default yang tidak melakukan apa-apa:
sumber
Ini berarti bahwa jika
x
diatur, nilai untukz
akanx
, jikay
tidak diatur maka nilainya akan ditetapkan sebagaiz
nilai.itu sama dengan
Itu mungkin karena operator logis dalam JavaScript tidak mengembalikan nilai boolean tetapi nilai elemen terakhir yang diperlukan untuk menyelesaikan operasi (dalam kalimat ATAU itu akan menjadi nilai non-salah pertama, dalam kalimat DAN itu akan menjadi yang terakhir ). Jika operasi gagal, maka
false
dikembalikan.sumber
||
operator hanya mengembalikan nilai kedua, terlepas dari apakah itu benar atau tidak.z
akan diatur ke nilaix
jika nilai yang truthy . Kalau tidak akan diatur ke nilaiy
. Ini berarti bahwa jikax
diatur ke, misalnya0
,, atau string kosong""
, ini tidak melakukan apa yang Anda katakan, karena nilai-nilai itu palsu .Ini disebut operator hubung singkat.
Evaluasi hubung singkat mengatakan, argumen kedua dieksekusi atau dievaluasi hanya jika argumen pertama tidak cukup untuk menentukan nilai ekspresi. ketika argumen pertama dari fungsi OR (||) mengevaluasi ke true, nilai keseluruhan harus benar.
Ini juga dapat digunakan untuk menetapkan nilai default untuk argumen fungsi.`
sumber
Ini akan mengevaluasi X dan, jika X bukan nol, string kosong, atau 0 (false false), maka akan menetapkannya ke z. Jika X adalah null, string kosong, atau 0 (false false), maka itu akan menetapkan y ke z.
Akan menampilkan 'bob';
sumber
false
, tetapi array kosong atau objek memaksatrue
.Menurut posting Blog Bill Higgins ' ; idiom logis Javascript ATAU penugasan (Februari 2007), perilaku ini berlaku pada v1.2 (setidaknya)
Dia juga menyarankan penggunaan lain untuk itu (dikutip): " normalisasi ringan perbedaan lintas-browser "
sumber