Çift boru operatörü ( ||) nedir?
Çift boru operatörü ( ||) mantıksal ORoperatördür . Gelen birçok dilde aşağıdaki şekilde çalışır:
- İlk değer ise
false, ikinci değeri kontrol eder. Eğer öyleyse true, geri döner trueve eğer öyleyse false, geri döner false.
- İlk değer ise
true, trueikinci değer ne olursa olsun her zaman geri döner .
Temel olarak bu işlev gibi çalışır:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Hala anlamadıysanız, şu tabloya bakın:
| true false
------+---------------
true | true true
false | true false
Diğer bir deyişle, yalnızca her iki değer de yanlış olduğunda yanlıştır.
JavaScript'te farkı nedir?
JavaScript biraz farklıdır, çünkü gevşek yazılan bir dildir . Bu durumda ||, boolean olmayan değerlerle operatörü kullanabileceğiniz anlamına gelir . Bir anlam ifade etmese de, bu operatörü örneğin bir işlev ve bir nesne ile kullanabilirsiniz:
(function(){}) || {}
Orada ne olur?
Değerler boole değilse, JavaScript örtük boole dönüştürür . Bu değer Falsey ise (örneğin, anlamına gelir 0, "", null, undefined(bakınız ayrıca JavaScript Tüm Falsey değerleri , bu olarak kabul edilecektir)) false; Aksi takdirde true.
Dolayısıyla yukarıdaki örnek vermelidir true, çünkü boş işlev doğrudur. Pekala, öyle değil. Boş işlevi döndürür. Çünkü JavaScript'in ||operatörü başlangıçta yazdığım gibi çalışmıyor. Aşağıdaki şekilde çalışır:
- İlk değer falsey ise , ikinci değeri döndürür .
- İlk değer doğruysa , ilk değeri döndürür .
Sürpriz? Aslında, geleneksel ||operatör ile "uyumlu" . Aşağıdaki fonksiyon olarak yazılabilir:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Eğer bir doğruluk değerini şu şekilde iletirseniz x, geri döner x, yani doğruluk değeri. Yani daha sonra ifyan tümcede kullanırsanız:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
olsun "Either x or y is truthy.".
Eğer xfalsey eitherXorYolsaydı , olurdu y. Bu durumda "Either x or y is truthy."eğer if ydoğruydu; aksi halde alırsınız "Neither x nor y is truthy".
Asıl soru
Şimdi, ||operatörün nasıl çalıştığını bildiğinizde, muhtemelen ne anlama x = x || ygeldiğini kendiniz belirleyebilirsiniz . Eğer xtruthy olduğunu xatanan xböylece aslında hiçbir şey olmuyor; Aksi yatanır x. Genellikle işlevlerdeki varsayılan parametreleri tanımlamak için kullanılır. Bununla birlikte, genellikle kötü bir programlama uygulaması olarak kabul edilir , çünkü parametre olarak bir falsey değerini (zorunlu olarak undefinedveya zorunlu değildir null) geçirmenizi önler . Aşağıdaki örneği düşünün:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
İlk bakışta geçerli görünüyor. Bununla birlikte, parametre falseolarak geçerseniz ne olur flagA(çünkü boole, yani trueveya olabilir false)? Olurdu true. Bu örnekte, ayarlamak için bir yolu yoktur flagAiçin false.
Açıkça olmadığını kontrol etmek daha iyi bir fikir olacağını flagAise undefinedböyle:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Daha uzun olmasına rağmen, her zaman çalışır ve anlaşılması daha kolaydır.
ES6 sözdizimini varsayılan işlev parametreleri için de kullanabilirsiniz , ancak eski tarayıcılarda (IE gibi) çalışmadığına dikkat edin. Bu tarayıcıları desteklemek istiyorsanız, kodunuzu Babel ile aktarmanız gerekir .
Ayrıca bkz . MDN'de Mantıksal İşleçler .
falsysadece SADECE değil , ilk değer ise ikinci değerin seçildiğinin farkında olunundefined. Gördüğüm kadar miktar,doWeDoIt = doWeDoIt || truebeni ağlatmak için yeterli. (yanidoWeDoItartık asla olmayacakfalse)