如果对象存在,则调用方法的 Javascript 速记

Posted

技术标签:

【中文标题】如果对象存在,则调用方法的 Javascript 速记【英文标题】:Javascript shorthand to call method if object exists 【发布时间】: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() 的返回值)。 【参考方案1】:

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

【讨论】:

您可以直接将可选链与函数调用一起使用,而不是使用调用: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 之后停止。

【讨论】:

以上是关于如果对象存在,则调用方法的 Javascript 速记的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript正则表达式三

JavaScript

HashSet重复元素判断

如果不存在,则追加对象 swift

Javascript ES6,如果存在则从数组中删除项目的最佳方法,如果不存在则添加

Javascript this的值