使用&&代替if是否有效?

时间:2019-06-18 16:17:58

标签: javascript if-statement boolean-logic

我正在像这样使用&&,它有效

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

代替

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

做错了还是只是风格和品味问题?对我来说,这很自然,我想使用&&,但是现在有一个短毛猫抱怨:期望一个赋值或函数调用,而是看到一个表达式。

这里可能有任何实际问题吗?还是只是出于惯例?


这是一个代码段:

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")

注释

  • 澄清我的目的是使用&&作为存在(声明和定义)的检查。
  • 如果&&的左侧失败,则右侧将不会执行
  • 它在return和分配中也很有用,但if却没有。如果需要 else 部分,请使用? then else 部分必须返回相同的类型。
  • 我起初错过了typeof并已改正,但在评论中看到它错过了。在我们大家都表现出理解的同时,也许是常见的错误或只是写得容易。但是正确的是(我认为)-检查存在性的唯一方法是使用typeofinstanceoftry,但window除外,例如您可以{{1} }。
  • 可以使用
  • history && history.back()At least one catch clause, or a finally clause, must be present
  • try { foo(); }; catch (e) {};等于if (a()) {b(); c()},因为函数可以同时存在于语句和表达式中。使用comma operator
  • 极端是未声明函数,而另一极端是当函数已经返回值a() && (b(), c())时,它无需再次返回(这称为确定性函数的记忆)

3 个答案:

答案 0 :(得分:3)

lint的工作是寻找在语法上有效可能不遵循建议的最佳做法的事物。

“预期分配或函数调用”可能意味着它期望foo在第一部分中是foo()foo =,在没有调用的情况下看到它是,一个错误。

您可以随意做任何想做的事情。短路评估的行为具有可预测性,因此可以正常工作,但可能会使不熟悉该样式的人感到困惑。

答案 1 :(得分:3)

您可以使用void operator。这将对表达式求值并返回undefined

void (foo && foo());

var foo;

void (foo && foo());

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

void (foo && foo());

答案 2 :(得分:2)

&&的背景中还有很多东西,但是在99%的情况下,这样做是完全可以的,就像这样。

现在,作为个人观点,对于单行代码,我更喜欢使用&&而不是if的方式,因为在下面没有空格的情况下,我无法忍受if关键字呵呵。

如果您知道自己在做什么,那么短绒棉有时会变得过于挑剔。