我有一个变量,如果该变量是一个对象,我想在该对象上调用一个方法,如果不是,我想什么都不做。
我想知道为什么我不应该这样做。
var foo = null;
////////////////////////////////////////////////
// some code that could change foo to a object
////////////////////////////////////////////////
foo && foo.bar();
答案 0 :(得分:2)
快速回答是肯定的,如果foo && foo.bar()
为foo
,则null
不会抛出异常,如果foo
为非空,bar()
将被评估,它的值将是表达式的值。
更长的答案是,任何值都可以解释为布尔值,在某种意义上,每个值都是真或假,并且布尔运算符执行短路评估 - 从左到右,如果我们看到{{ 1}}或false &&
,没有理由进行评估。
最后一个事实是布尔表达式的值是发生短路的表达式的值。
答案 1 :(得分:1)
您需要将对象分配给foo
和带有函数的preoperty。
var foo;
foo = {};
foo.bar = function () {
console.log('inside bar');
};
foo && foo.bar && foo.bar();

答案 2 :(得分:0)
((typeof foo === 'object') && foo.bar())
或
(!(typeof foo == 'object') || foo.bar())
如果foo是object类型,则执行。
请在此处查看我的答案javascript using or operator to iterate over list of strings。
这是一个常见的"如果某些人在这样的序列中使用了分配,并忘记评估在第一个为真之后停留在||
序列中,或者在&&
中第一个为假之后停止。
答案 3 :(得分:0)
使用ES6,您可以将optional chaining operator与call组合在一起:
foo?.bar?.call()
如果要传递参数,请记住,调用中的第一个在函数调用中分配了this
var foo = {
bar: function(x) { return x; }
};
first.value = foo?.bar?.call(0,42); // 42
second.value = foo?.baz?.call(0,42); // undefined, no error
<input id="first">
<input id="second">