2016-07-28 2 views
-2

У меня есть переменная, и если эта переменная является объектом, я бы хотел вызвать метод для этого объекта, если я не хочу ничего делать.Условное обозначение Javascript для вызова, если существует объект

Мне интересно, есть ли причина, почему я не должен делать это так.

var foo = null; 

    //////////////////////////////////////////////// 
    // some code that could change foo to a object 
    //////////////////////////////////////////////// 

foo && foo.bar(); 
+0

Если вы знаете, что делаете, нет способа, которым вы не должны этого делать ... – Rayon

+0

будет определяться таким образом? – epascarello

+0

Foo начинает с нуля, но может быть изменен позже из события click. Затем в других событиях клика я проверяю, все ли это null, если это так, я ничего не делаю, если не null, тогда ему был назначен объект, и я хочу вызвать метод для этого объекта. – cmac

ответ

1

Быстрый ответ да, foo && foo.bar() не будет бросать исключение, если foo является null, и если foo является ненулевым, bar() будет оцениваться, и это значение будет значение выражения.

Более длинный ответ заключается в том, что любое значение может быть интерпретировано как логическое, в том смысле, что каждое значение является либо правдивым, либо ложным, и что булевы операторы выполняют оценку короткого замыкания - слева направо, если мы видим false && или true ||, нет причин продолжать оценивать.

Последний факт состоит в том, что значение булева выражения является значением выражения, в котором произошло короткое замыкание.

0
((typeof foo === 'object') && foo.bar()) 

или

(!(typeof foo == 'object') || foo.bar()) 

Если Foo имеет объект типа затем выполнить.

См. Мой ответ здесь javascript using or operator to iterate over list of strings также.

Это «распространенная» проблема для непреднамеренного поведения, если некоторые используют назначения внутри такой последовательности и забывают, что оценка останавливается в последовательности || после первой истины или останавливается после первого ложного в &&.

0

Вам необходимо назначить объект foo и предоперацию с функцией.

var foo; 
 

 
foo = {}; 
 
foo.bar = function() { 
 
    console.log('inside bar'); 
 
}; 
 

 
foo && foo.bar && foo.bar();

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