JavaScript’in C #’da && Operator gibi "kısa devre" değerlendirmesi olup olmadığını öğrenmek istiyorum. Değilse, benimsemenin mantıklı olduğu bir geçici çözüm olup olmadığını bilmek isterim.
JavaScript’in C #’da && Operator gibi "kısa devre" değerlendirmesi olup olmadığını öğrenmek istiyorum. Değilse, benimsemenin mantıklı olduğu bir geçici çözüm olup olmadığını bilmek isterim.
Yanıtlar:
Evet, JavaScript'in "kısa devre" değerlendirmesi var.
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Short-circuit
bu mantık operatörüyle bir olamaz . Sadece kendiniz deneyin. Demomu kullan.
Bu cevap, nasıl kısa devreJavaScript ile çalışır, tüm gotcha'larla ve ayrıca operatör önceliği gibi ilgili temalarla çalışır, hızlı bir tanım arıyorsanız ve kısa devrenin nasıl çalıştığını zaten anlıyorsanız, diğer cevapları kontrol etmenizi tavsiye ederim.
Öncelikle if()
bloğun içinde hepimizin aşina olduğu davranışı inceleyelim , burada &&
iki şeyin olup olmadığını kontrol edelim true
:
if (true && true) {
console.log('bar');
}
Şimdi, ilk içgüdünüz muhtemelen şunu söylemektir: 'Ah evet, oldukça basit, kod, her ikisi de expr1
ve expr2
olarak değerlendirilirse ifadeyi çalıştırır true
'
Hem evet hem hayır. Teknik olarak haklısınız, tanımladığınız davranış budur, ancak bu tam olarak kodun nasıl değerlendirildiği değildir ve tam olarak anlamak için daha derine inmemiz gerekir.
&&
ve ||
yorumlanır ?:"Kaputunun altına" bakma zamanı javascript motor ". Şu pratik örneği ele alalım:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
Peki sonuç 260
... ama neden? Cevabı alabilmek için kısa devre değerlendirmesinin nasıl çalıştığını anlamamız gerekiyor.
By MDN Tanımı
&&
operatörüexpr1 && expr2
ve arkasından yürütülür:Eğer
expr1
dönüştürülebilirtrue
dönüşleri,expr2
; aksi takdirde dönerexpr1
.
Yani bu, bizim pratik örneğimizde const res
aşağıdaki şekilde değerlendirildiği anlamına gelir :
expr1
-sanitise(0xFF)
0xFF
250 için geçerli bir onaltılık sayıdır, aksi takdirde döndürürdüm NaN
expr1
Bir "truthy" değer döndürdü, zaman yürütmek için expr2
(aksi durdurmak istiyorum NaN
falsy olan)userinput
truthy (bir numara), ben ekleyebilir +5
kendisineBöylece burada, operatörün basit bir kullanımı ile ek if
bloklardan ve daha fazla isNaN
kontrolden kaçınmayı başardık &&
.
Şimdiye kadar, en azından nasıl bir kısa devreoperatörler çalışır. Evrensel kural şu şekildedir:
(some falsy expression) && expr
yanlış ifade olarak değerlendirilecek(some truthy expression) || expr
doğru ifadeyle değerlendirecekİşte daha iyi anlamak için bazı başka örnekler:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
Güzel, umarım onu anlıyorsundur! Bilmemiz gereken son şey, operatör önceliğiyle ilgili bir kuraldır, yani:
&&
Operatör her zaman önce çalıştırılır ||
operatörü.Aşağıdaki örneği düşünün:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
Bu, belki bazılarına kafa karıştırıcı bir şekilde geri dönecektir a()
. Sebep oldukça basit, sadece gözümüz bizi kandırıyor çünkü soldan sağa okumaya alışkınız. Hadi console.log()
ve neyi çıkaralım ve tamamen değerlendirmeye odaklanalım
true || false && false
Şimdi kafanızı bunun etrafına sarın:
&&
Operatörün önceliği var dedik , bu yüzden ilk olarak değerlendirilir. Değerlendirmeyi daha iyi hayal etmemize yardımcı olmak için tanımı düşünün
expr1 && expr2
Nerede:
expr2
dır-dir false
expr1
dır-dir true || false
İşin zor kısmı buydu, şimdi true || false
değerlendirildi ( expr1
- sol tarafı &&
).
||
varsa operatör yürütme durur expr1 || expr2
içinde expr1
truthy olarak değerlendirir, expr1
yürütülen ve kod yürütme durur.Döndürülen değer true
Şey .. bu oldukça aldatıcıydı, hepsi birkaç tuhaf kural ve anlambilim nedeniyle. Ancak unutmayın, operatör önceliğinden her zaman kaçabilirsiniz ()
- tıpkı matematikte olduğu gibi
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
ve expr2
ya condition1
ya da her türlü, bu sadece karıştırıyor. Birine karar verin, yerel değişkenleri de tanıtabilirsiniz, örn. const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
Aramaları hızlandırmak için arama kısayolu (Chrome / Firefox) olarak ekledim .