如果对象存在,则调用方法的 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】:
快速回答是肯定的,如果foo
是null
,foo && 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 之后在 ||
序列中停止,或者在 &&
中的第一个 false 之后停止。
【讨论】:
以上是关于如果对象存在,则调用方法的 Javascript 速记的主要内容,如果未能解决你的问题,请参考以下文章