Książka wskazuje na zasady lub:

  • Jeśli pierwszy operand jest obiektem, to pierwszy operand jest zwracany.
  • Jeśli pierwszy operand ocenia się FAŁSZ, drugi operand jest zwracany.
  • Jeśli oba operandy są obiektami, to pierwszy operand jest zwracany.
  • Jeśli oba operandy są null, a następnie zwracany jest NULL.
  • Jeśli obie operandy są Nan, wtedy Nan jest zwracany.
  • Jeśli obie operandy są niezdefiniowane, wtedy nieokreślony jest zwracany.

Jednak obserwowałem następujące zachowanie podczas kodowania:

        var result18 = (NaNVar || undefinedVar);  //undefined
        var result19 = (NaNVar || nullVar);  //null
        var result20 = (undefinedVar || NaNVar);  //NaN
        var result21 = (undefinedVar || nullVar); //null
        var result22 = (nullVar || NaNVar); //NaN
        var result23 = (nullVar || undefined);   //undefined

Jak mogę uzasadnić to zachowanie dla tych zasad?

0
Maha 8 wrzesień 2012, 18:06

3 odpowiedzi

Najlepsza odpowiedź

Tak Po obserwacji wyników, zawarłem dwa proste zasady:

        //1: if the first operand evaluates to true then it is returned (here it means actual //value of operand is returned but not the evaluated value that is true)
        //following values evaluates to ture: non-empty string, non-zero number and //none of these values- NaN, null, undefined

        var result = ("Mahesh" || false) //"Mahesh"
        var result = ("Mahesh" || true) //"Mahesh"
        var result = ("Mahesh" || undefined) //"Mahesh"
        var result = ("Mahesh" || null) //"Mahesh"
        var result = ("Mahesh" || NaN) //"Mahesh"
        var result = (5 || false) //5
        var result = (5 || true) //5
        var result = (5 || null) //5
        var result = (5 || NaN) //5
        var result = (5 || undefined) //5

        //2: if first operand evaluates to false then the value of second operand is //returned, again without evaluating it
        //following values evaluate to false: empty string (""), number zero (0),  null, //NaN, undefined or false)

        var result = (false || NaN);  //NaN
        var result = (false || null);  //null
        var result = (false || undefined);  //undefined
        var result = (false || "Mahesh");  //Mahesh
        var result = (false || 5);  //5

        var result = (NaN || false);   //false
        var result = (NaN || true);   //true
        var result = (NaN || NaN);   //NaN
        var result = (NaN || null);  //null
        var result = (NaN || undefined);  //undefined
        var result = (NaN || "Mahesh");   //Mahesh
        var result = (NaN || 5);   //5

        var result = (null || false);  //false
        var result = (null || true);  //true
        var result = (null || NaN); //NaN
        var result = (null || null);  //null
        var result = (null || undefined);   //undefined
        var result = (null || "Mahesh");  //Mahesh
        var result = (null || 5);  //5

        var result = (undefined || false);  //false    
        var result = (undefined || true);  //true
        var result = (undefined || NaN);  //NaN
        var result = (undefined || null); //null
        var result = (undefined || undefined);  //undefined
        var result = (undefined || "Mahesh");  //Mahesh
        var result = (undefined || 5);  //5

        var result = (0 || false); //false
        var result = (0 || true); //true
        var result = (0 || NaN); //NaN
        var result = (0 || null);  //null
        var result = (0 || undefined);   //undefined
        var result = (0 || "Mahesh"); //Mahesh
        var result = (0 || 5); //5

        var result = ("" || false); //false
        var result = ("" || true); //true
        var result = ("" || NaN); //NaN
        var result = (""|| null);  //null
        var result = (""|| undefined);   //undefined
        var result = ("" || "Mahesh"); //Mahesh
        var result = ("" || 5); //5

        //Note: if the first operand evaluates to false and if the second operand is undeclared 
        //variable then it will cause an error
        var result = (false || undeclaredVar);    //error

Myślę, że to wszystko w prostych słowach. Czy ktoś może potwierdzić, czy mam rację? Próbowałem tego w IE10, mam nadzieję, że wszystko będzie spójne w innych przeglądarkach.

0
4 revs 10 wrzesień 2012, 19:57

Przepraszam za zamieszanie wokół opisu w książce. Próbowałem wyliczyć przypadki krawędzi i widzę, jak to może spowodować pewne zamieszanie.

Możesz dokładnie opisać operację przy użyciu tylko dwóch reguł: jeśli pierwszy argument jest prawdą, zwróć pierwszy argument; Jeśli pierwszy argument jest falscyjny, zwróć drugi argument. Twoja trzecia reguła nie tylko dotyczy tego operatora, niezdecydowana zmienna zawsze powoduje, że zostanie rzucony, gdy próbujesz go użyć. Nie ma znaczenia, co próbujesz go używać (z wyjątkiem typu PageOF i DELETE, który działa dobrze w zmiennych niezgodnych).

3
Nicholas C. Zakas 9 wrzesień 2012, 16:21

Twoja książka wybrała straszny sposób opisania logicznego lub operatora.

Na przykład ta zasada jest zbyt ograniczona.

Jeśli pierwszy operand jest obiektem, to pierwszy operand jest zwracany.

Operator nie wykonuje żadnego rodzaju czeku typu. Nie obchodzi to, czy pierwszy lub drugi operand jest "obiektem". Dba tylko o to, jak zmuszają do boolowskiego.

Weź tego przykładu.

"foobar" || false

Pierwszy operand jest łańcuchem, a nie obiektem, ale będzie zmuszony do boolowskiego true, więc pierwszy operand zostanie zwrócony.

Boolean("foobar"); // true

Twoja książka przechodzi przez punkty bullet, jakby podążał za jakiś określony algorytm. Nie ma takiego algorytmu. Porównanie jest ściśle oparte na przymusu boolowskiego.

Umieścić to po prostu,

  • Oceniając operandy od lewej do prawej, aż do znalezienia, który będzie się uwzględnić do true lub dopóki nie skończy się z operandów.
  • Ostatnia ocena operanda jest zwracana (bezstronna)

11.11 Binary Logiczne operatorzy

  1. pozwól lref być wynikiem oceny logiczniexxpression.

  2. pozwól lval być GetValue(lref).

  3. Jeśli ToBoolean(lval) jest true, powrót lval.

  4. pozwól rref być wynikiem oceny logicznyAdekspresji.

  5. powrót GetValue(rref).

2
gray state is coming 8 wrzesień 2012, 14:29