Javascript shorthand 如果对象存在则调用方法

Javascript shorthand to call method if object exists

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

我想知道我是否有任何理由不应该这样做。

var foo = null;

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

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

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

如果 foo 是对象类型则执行。

也可以在此处查看我的回答

这是一个 "common" 意外行为问题,如果某些人在这样的序列中使用赋值并忘记评估在 || 序列中的第一个 true 之后停止,或者在 || 序列中的第一个 false 之后停止&&.

您需要将一个对象分配给 foo 和一个具有函数的 属性。

var foo;

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

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

快速回答是,如果 foonullfoo && foo.bar() 不会抛出异常,如果 foo 为非空,bar() 将被评估,它的值将是表达式的值。

更长的答案是任何值都可以解释为布尔值,因为每个值要么为真要么为假,并且布尔运算符进行短路评估——从左到右,如果我们看到false &&true ||,没有理由继续评估。

最后一个事实是布尔表达式的值是发生短路的表达式的值。

使用 ES6,您可以组合 optional chaining operator with 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">