2013-09-06 11 views
12

!!x wymusza typ zmiennej x na wartość logiczną, przy jednoczesnym zachowaniu jej prawdziwości lub jej braku - see this question - Mam pytanie dotyczące użycia tego w wyrażeniach warunkowych.Dlaczego warto korzystać !! wymusić na zmiennej wartość boolean do użycia w wyrażeniu warunkowym?

Kilka razy w kodzie JS widziałem !! wykorzystywane do zmuszania do zmiennej typu Boolean w stanie if jak tak

if(!!x) { 
    x.doStuff(); 
} 

Jeżeli chodzi o to, aby sprawdzić, czy x jest zdefiniowane przed wywołaniem metody na to.

Ale w moim kodzie zawsze tylko używane

if(x) { 
    x.doStuff(); 
} 

na założeniu, że jeśli x jest zdefiniowany warunek minie, a jeśli x jest niezdefiniowany, to nie minie.

Moje pytanie brzmi: Jaki jest sens wymuszenia na x na wartość logiczną przy użyciu !! w tym scenariuszu? Co robi this code zrobić, że nie ma tego ?

Jestem zakładając inni programiści nie tylko go używać, ponieważ wygląda cool, więc albo to albo jeden z moich założeń jest źle :-)

+1

Nie, podłączyłem to pytanie i rozumiem odpowiedź, pytam, jaki jest sens w wymuszaniu tego typu na boolean w tym scenariuszu - proszę przeczytać pytanie przed oznaczeniem jako duplikat! – davnicwil

+2

Odpowiedź brzmi, że nie ma sensu robić tego. To zupełnie tak samo, jakbyś przestał "!!". – user2736012

+1

Rzeczywiście. Ludzie robią różnego rodzaju zabobonne rzeczy podczas nauki programowania. –

Odpowiedz

11

w tym konkretnym kontekście by powiedzieć, że nie ma różnicy między jawnie konwersji do wartości logiczne pomocą !! lub pozwolić, czy ekspresja przekształcane w wartości logicznej naturalny. Mam na myśli to, że if (x) będzie interpretowany jako if (Boolean(x)), który jest taki sam jak if (!!x).

Jeśli jednak wracają do wartości z funkcji, na przykład, jeśli chcesz wdrożyć arrayHasItems funkcji, można je wdrożyć w ten sposób:

function arrayHasItems(arr) { 
    return arr.length; 
} 

Korzystanie z funkcji w razie oświadczenia co jest zadziała, ponieważ wartość liczbowa zwrócona z funkcji zostanie przekonwertowana na wartość logiczną.Jednak kod klient oczekuje, że funkcja zwraca wartość logiczną, więc może być sprawdzenie stanu wykonując:

if (arrayHasItems(arr) === true) {} 

w tym przypadku byłoby to fail, bo wrócił z arrayHasItems wynik był liczbą. Dlatego lepiej byłoby zaimplementować tę funkcję, zwracając wartość logiczną, jak oczekiwano.

function arrayHasItems(arr) { 
    return !!arr.length; 
} 

EDIT:

To doprowadza się nowe pytanie: dlaczego !! arr.Length a nie tylko arr.Length> 0

Nie isin't żadnej różnicy między zarówno w wygenerowanym wyniku, jak i nie zapisujesz nawet bajtów, ponieważ obie instrukcje mają taką samą liczbę znaków. Jednak utworzyłem test case, a podwójna negacja wydaje się działać lepiej, ale może nie być spójna we wszystkich przeglądarkach.

+1

Pojawia się nowe pytanie: dlaczego '!! arr.length', a nie tylko' arr.length> 0'? – BalusC

+0

@BalusC, zaktualizowałem odpowiedź, podwójna negacja wydaje się działać lepiej. – plalx

0

Jak stwierdzono konwertuje wartość do wartości logicznej i dlatego nie różni się zbytnio od if(x). Obydwa są jednak trudne, ponieważ konwertują także 0 na false i inne podobne rzeczy.

+3

Nie widzę, jak twoje przykłady mają coś wspólnego z pytaniem. – smerny

+0

'if (myValue! == null && myValue! == undefined)' nie jest tym samym, co 'if (myValue) {}' –

+0

Dobrze, usunięto przykłady. Punkt, który próbowałem wykonać, nie robi sprawdzeń zerowych, po prostu zaznaczając 'if (x)' lub 'if (!! x)', ponieważ jest to niejednoznaczne. –

0

Ma to związek z typem JavaScript.

Często chcesz sprawdzić, jeśli obiekt nie jest pusty, nie zdefiniowana, nie 0, itd. Wspólna droga, aby sprawdzić, że jest

if (obj) { 
    ... 
} 

Jednak jeśli chcesz warunek, aby była równa true lub false z ! można używać w obiektach innych niż boolowskie. Oto przykład, który używa operatora równości ===, który nie nadaje typu kojarzenia.

var obj = {}; 

console.log(obj === true); // returns false 
console.log(!obj === false); // returns true 
console.log(!!obj === true); // returns true 
Powiązane problemy