使用 && 而不是 if 是否有效?

Is it valid to use && instead of if?

我正在使用 && 并且它有效

typeof foo === 'function' && foo(); //if foo exist then call it

而不是

if (typeof foo === 'function') { foo(); }

是做错了还是风格和品味问题?对我来说这很自然,我想使用 &&,但现在一个 linter 抱怨:Expected an assignment or function call and instead saw an expression.

这里会不会有任何实际问题,或者这只是约定俗成的问题?


这是一个代码片段:

function foo(x) {
  console.log("foo say " + x)
}

function bar(x) {
  console.log("bar say " + x)
}

let s = "OK"

typeof foo === 'function' && foo(s)

if (typeof bar === 'function') bar(s)

/*
   Function noo() does not exist.
   Error to try call it is prevented by the check.
   noo && noo() is not enough, so typeof is a must! 
*/
typeof noo === 'function' && noo()

console.log("OK so far")

注释

linter 的工作是寻找虽然语法有效可能不遵循推荐的最佳实践的东西。

"Expected an assignment or function call"大概的意思是它希望foo在第一部分是foo()foo =,看到它没有调用在它看来,一个错误。

你可以自由地做任何你想做的事。 Short-circuit 评估的行为是可预测的,所以它会起作用,但它可能会让不熟悉这种风格的人感到困惑。

您可以使用 void operator。这将计算表达式和 returns undefined.

void (foo && foo());

var foo;

void (foo && foo());

foo = () => console.log('foo');

void (foo && foo());

背景中 && 的东西有点多,但是对于 99% 的情况来说,这样做是完全没问题的,就像这个一样。

现在作为个人意见,对于 one-liner 我更喜欢 && 方式而不是 if 方式,因为我无法忍受 if 关键字下面没有方块呵呵。

如果你知道自己在做什么,linters 有时太挑剔了。