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-circuitbu 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 expr1ve expr2olarak 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 && expr2ve arkasından yürütülür:Eğer
expr1dönüştürülebilirtruedönüşleri,expr2; aksi takdirde dönerexpr1.
Yani bu, bizim pratik örneğimizde const resaş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 NaNexpr1Bir "truthy" değer döndürdü, zaman yürütmek için expr2 (aksi durdurmak istiyorum NaNfalsy olan)userinputtruthy (bir numara), ben ekleyebilir +5kendisineBöylece burada, operatörün basit bir kullanımı ile ek ifbloklardan ve daha fazla isNaNkontrolden 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 falseexpr1 dır-dir true || falseİşin zor kısmı buydu, şimdi true || falsedeğerlendirildi ( expr1- sol tarafı &&).
||varsa operatör yürütme durur expr1 || expr2içinde expr1truthy olarak değerlendirir, expr1yü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()
*/
expr1ve expr2 ya condition1ya 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+%sAramaları hızlandırmak için arama kısayolu (Chrome / Firefox) olarak ekledim .