2010-04-06 16 views
5

natknąłem tym fragmencie kodu (zmodyfikowanej) w naszej aplikacji i jestem zdezorientowany, jak to działa:Anding javascript obiektów wraz

function someObject() 
    { 
     this.someProperty = {}; 
     this.foo = 
     { 
      bar: 
      { 
       baz: function() { return "Huh?" } 
      } 
     }; 

     this.getValue = function() 
     { 
      return (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) || null; 
     } 
    } 

    function test() 
    { 
     var o = new someObject(); 
     var val = o.getValue(); 
     alert(val); 
    } 

po wywołaniu funkcji test(), tekst „Hę? " jest ostrzeżony. Nie jestem pewien, jak wynika z getValue wraca, że ​​bym myślał robi & & B & & C & & D byłby zwrócony prawda, zamiast wartości D.

+0

Naprawiono próbkę powyżej. :) – Jonas

Odpowiedz

10

tak się dzieje, ponieważ Boolean Operators w JavaScript może zwrócić argumentu, a niekoniecznie Boolean wynikiem, np

operatora logicznego AND (&&) zwraca wartość drugiego argumentu operacji, jeżeli pierwszy jest truthy:

0.123.
true && "foo"; // "foo" 

I zwróci wartość pierwszego operandu jeśli jest sam falsy:

NaN && "anything"; // NaN 
0 && "anything"; // 0 

Dlatego w swoim przykładzie "Huh?" jest zwracany, ponieważ wszystkie powyższe wyrażenia są truthy:

alert("A" && "B" && "C" && "Huh?"); // "Huh?" 
alert(true && true && true && "Huh?"); // "Huh?" 

logicznego OR PRACY lub (||) ma podobne zachowanie, zwróci wartość drugiego argumentu, jeśli pierwsza jest falsy:

false || "bar"; // "bar" 

I zwróci wartość pierwszego operandu jeśli jest sam non-falsy:

"foo" || "anything"; // "foo" 

Takie zachowanie jest często używany do ustawiania wartości domyślnych , na przykład:

function test (arg1) { 
    arg1 = arg1 || "default value"; 
} 

Uwaga: wartości Falsy są te, które zmusić do false użyte w kontekście logicznym, a są to: null, undefined, NaN, 0, zerowej długości ciąg, i oczywiście false. Cokolwiek innego zmusi do true.

+0

może to naprawić jego problem: !! (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) zanotuj "!!" –

+1

W pokrewnym notatce istnienie tego pytania jest dowodem na to, że używanie tych boolowskich skrótów syntaktycznych dla logiki powinno być uważane za złą formę ... "Powiedz, co masz na myśli", powiedział March Hare. – dkamins

+1

Doskonałe podsumowanie javascripts często źle rozumie operatorów! –

Powiązane problemy