【问题标题】:Javascript shorthand to call method if object exists如果对象存在,则调用方法的 Javascript 速记
【发布时间】:2016-12-03 07:25:40
【问题描述】:

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

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

var foo = null;

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

 foo && foo.bar();

【问题讨论】:

  • 如果你知道自己在做什么,就没有办法不去做......
  • foo 会被这样定义吗?
  • @cmac 我的意思是,如果它按预期工作,请忙于了解它是如何工作的。如果你能弄清楚,那就去做吧,因为你可以解决未来可能出现的问题。 . 如果你看不懂,请选择不太复杂和可读的版本..
  • @cmac 这种模式没有什么新东西。更多虚假和运营商的理解......
  • 不确定为什么 OP 在这里遇到困难。这是一个合理的问题(我猜可能是一个重复)。我理解的问题是“如果 foo 为空,表达式是否会抛出异常,并且(隐式)表达式的值是什么?”我的回答是:“当 foo 为 null 时,此表达式可以正常工作(并且值为 null),当 foo 是实现 bar 的对象时,它可以正常工作(并且具有 bar() 的返回值)。

标签: javascript object methods logical-operators shorthand


【解决方案1】:

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

【讨论】:

  • 您可以直接将可选链与函数调用一起使用,而不是使用调用:foo?.bar?.()。这不仅更短,而且在 Typescript 中效果更好,因为与使用 call 相比,这为您提供了智能感知。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      ((typeof foo === 'object') && foo.bar())
      

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

      如果 foo 是 object 类型,则执行。

      也可以在这里查看我的答案javascript using or operator to iterate over list of strings

      这是一个意外行为的“常见”问题,如果一些人在这样的序列中使用赋值并忘记评估在第一个 true 之后在 || 序列中停止,或者在 &amp;&amp; 中的第一个 false 之后停止。

      【讨论】:

        猜你喜欢
        • 2015-07-02
        • 2012-08-31
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 2016-02-11
        • 1970-01-01
        相关资源
        最近更新 更多