Çift boru operatörü ( ||
) nedir?
Çift boru operatörü ( ||
) mantıksal OR
operatö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 true
ve eğer öyleyse false
, geri döner false
.
- İlk değer ise
true
, true
ikinci 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 if
yan 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 x
falsey eitherXorY
olsaydı , olurdu y
. Bu durumda "Either x or y is truthy."
eğer if y
doğ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 || y
geldiğini kendiniz belirleyebilirsiniz . Eğer x
truthy olduğunu x
atanan x
böylece aslında hiçbir şey olmuyor; Aksi y
atanı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 undefined
veya 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 false
olarak geçerseniz ne olur flagA
(çünkü boole, yani true
veya olabilir false
)? Olurdu true
. Bu örnekte, ayarlamak için bir yolu yoktur flagA
için false
.
Açıkça olmadığını kontrol etmek daha iyi bir fikir olacağını flagA
ise undefined
bö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 .
falsy
sadece SADECE değil , ilk değer ise ikinci değerin seçildiğinin farkında olunundefined
. Gördüğüm kadar miktar,doWeDoIt = doWeDoIt || true
beni ağlatmak için yeterli. (yanidoWeDoIt
artık asla olmayacakfalse
)