使用 && 而不是 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")
注释
- 澄清我的目的是使用
&&
作为存在性检查(声明和定义)。
- 如果
&&
的左侧失败,右侧将不会执行
- 它在
return
和作业中也很有用,但 if
不是。如果需要 else 部分,则使用 ?
。 然后 else 部分必须 return 相同类型。
- 我一开始错过了
typeof
并已更正,但在评论中看到它错过了。也许是常见的错误,或者只是简单的写作,而我们都表现出理解。但要正确(我认为)- 检查存在的唯一方法是使用 typeof
, instanceof
or try
除了 window
你可以做的事情,例如 history && history.back()
.
try { foo(); }; catch (e) {};
可以用。 At least one catch clause, or a finally clause, must be present.
if (a()) {b(); c()}
等于 a() && (b(), c())
因为函数既可以在语句中也可以在表达式中。使用 comma operator.
- 极端是函数没有声明,另一个极端是函数已经return编辑了一个值
x = x || foo()
,它不需要再次return(即调用确定性函数的记忆)
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 有时太挑剔了。
我正在使用 &&
并且它有效
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")
注释
- 澄清我的目的是使用
&&
作为存在性检查(声明和定义)。 - 如果
&&
的左侧失败,右侧将不会执行 - 它在
return
和作业中也很有用,但if
不是。如果需要 else 部分,则使用?
。 然后 else 部分必须 return 相同类型。 - 我一开始错过了
typeof
并已更正,但在评论中看到它错过了。也许是常见的错误,或者只是简单的写作,而我们都表现出理解。但要正确(我认为)- 检查存在的唯一方法是使用typeof
,instanceof
ortry
除了window
你可以做的事情,例如history && history.back()
. try { foo(); }; catch (e) {};
可以用。 At least one catch clause, or a finally clause, must be present.if (a()) {b(); c()}
等于a() && (b(), c())
因为函数既可以在语句中也可以在表达式中。使用 comma operator.- 极端是函数没有声明,另一个极端是函数已经return编辑了一个值
x = x || foo()
,它不需要再次return(即调用确定性函数的记忆)
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 有时太挑剔了。