2010-04-06 2 views
5

Я натыкался на этот кусок кода (модифицированного) в нашем приложении, и я запутался, как она работает:операция AND Javascript объекты вместе

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); 
    } 

при вызове функции Test(), текст «А? " предупреждается. Я не уверен, как результат ПолучитьЗначение возвращается, что, я бы подумал, делая & & B & & C & & D вернулся бы так, а не значения D.

+0

Исправлен образец выше. :) – Jonas

ответ

10

Это происходит потому, что Boolean Operators в JavaScript может вернуть операнд, и не обязательно Boolean результат, например:

логический оператор и (&&), возвращает значение второго операнда, если первый является truthy:

true && "foo"; // "foo" 

И он возвращает значение первого операнда, если он сам по себе falsy:

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

Вот почему в вашем примере "Huh?" возвращается, потому что все предыдущие выражения truthy:

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

Логическое ИЛИ Operat или (||) имеет аналогичное поведение, он возвращает значение второго операнда, если первый из них является falsy:

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

И это возвращает значение первого операнда, если он сам по себе без falsy:

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

Такое поведение часто используется для установки значения по умолчанию , например:

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

Примечание: значения Falsy являются те, которые принуждают к false при использовании в логическом контексте, и они: null, undefined, NaN, 0, строка нулевой длины, и, конечно же false. Все остальное будет зависеть от true.

+0

это может исправить его проблему: !! (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) отметить "!!" –

+1

Относительно примечания, существование этого вопроса здесь свидетельствует о том, что использование этих логических синтаксических ярлыков для логики должно считаться плохой формой ... «Скажите, что вы имеете в виду», - сказал Мартовский Заяц. – dkamins

+1

Отличное резюме javascripts часто неправильно понимает операторов! –

Смежные вопросы