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();
快速回答是,如果 foo
为 null
,foo && 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">
我有一个变量,如果该变量是一个对象,我想对该对象调用一个方法,否则我什么都不做。
我想知道我是否有任何理由不应该这样做。
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();
快速回答是,如果 foo
为 null
,foo && 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">