如果对象存在,Javascript简写为调用方法

时间:2016-07-28 18:33:35

标签: javascript object methods logical-operators shorthand

我有一个变量,如果该变量是一个对象,我想在该对象上调用一个方法,如果不是,我想什么都不做。

我想知道为什么我不应该这样做。

var foo = null;

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

 foo && foo.bar();

4 个答案:

答案 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 operatorcall组合在一起:

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">