2012-03-30 8 views
5

Czy ktoś może wyjaśnić cel podwójnej negacji reverse var w poniższym kodzie?Znaczenie [-1,1] [+ !! boolean_var]

return function (a,b) { 
    var A = key(a), B = key(b); 
    return ((A < B) ? -1 : 
      (A > B) ? +1 : 0)) * [-1,1][+!!reverse];     
} 

Tak jak ja to rozumiem, celem jest, aby wybrać odpowiedniego indeksu z tablicy [-1,1] aby następnie wykorzystać je w mnożenie, ale wydaje mi się, że [-1,1][+!!reverse]; może być bezpiecznie zastąpione [-1,1][+reverse];

Am Mylę się? Co zyskujesz lub zapobiegasz przez podwójne negowanie tam reverse?

Widziałem powyższy kod na this answer.

+0

To jest niesamowite, ciekawy, aby zobaczyć odpowiedź na ten jeden –

+0

Zmienia wartość reverse na boolean. [Co to jest !! (nie jest) operator w JavaScript?] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) – Mizuho

+1

Używałbym '(reverse? 1: -1) 'zamiast' [-1,1] [+ !! reverse] ', IMO jest po prostu bardziej przejrzysty, jest tańszy, nie potrzebuje obiektu tablicy i dostępu do indeksu, a nawet konwersja boolean jest niejawnie wykonana przez operator warunkowy ... – CMS

Odpowiedz

5

Najprostszą odpowiedzią jest prawdopodobnie kontrprzykład:

+undefined //NaN 
+!!undefined // 0 

ponieważ zawartość [] są zazwyczaj zamieniane na łańcuchy, [NaN] dokładają wszelkich starań, aby uzyskać dostęp właściwość o nazwie „NaN” z tablicy, która nie istnieje, a powróci niezdefiniowany:

[1,-1][+undefined] 
[1,-1][NaN] 
[1,-1]["NaN"] 
undefined 
+0

'[1, -1] [" 0 "]' to '1'. :-P –

+1

Dzięki, czuję, że muszę uruchomić i kupić książkę Javascript JAK NAJSZYBCIEJ: $ – Icarus

4

Pokój negującymi po prostu sprawia, że ​​mamy właściwego bool ean. Ponieważ odwrotnością może być cokolwiek, podwójne negowanie wywołuje "falsy" konwersje JavaScriptu. Tak więc, na przykład:

!!"hello" // true 
!!"" // false 
!!1 // true 
!!some_undefined_var // false 
2

!! konwertuje wartość logiczną. Jest to konieczne, jeśli reverse nie jest boolowskie, aby rozpocząć.

Zastanów się: +!!"hi". Jest to 1, ale +"hi" jest NaN.

1

Podwójna negacja zasadniczo rzuca odwrotność jako boolean, a następnie + będzie rzutować tę wartość logiczną jako int.

tak, jeśli jest odwrotna ewentualnie: "tak", "nie", "", true, false, 0,1,2, niezdefiniowana

podwójna negacja sprawi "tak" -> true "nie" -> true "" -> false prawda -> true false -> false niezdefiniowana -> false

następnie + przekonwertuje trues do 1, a falses 0, tak że może być używany jako indeks tablicy.