如果使用 AND 运算符

if with AND operator

我正在学习 React,我遇到了下一个表达式
ReactDOM.render(true && 123 && <functionThatReturnBool> && "foo")

我试着研究了一下,没有找到太多资源,所以我稍微玩了一下代码,这就是我想出的:

是否有任何来源可以解释这个表达式?
我 missed/wrong 在做什么?

那就是logical AND operator.它的工作原理很简单。

  1. 计算左边的表达式。
  2. 如果左边表达式的值为falsy
    • Return左边表达式的值。
  3. 其他
    • 计算并return右边表达式的值。

注意如果左边的表达式为真,only 中右边的表达式是如何计算的。这个很重要。这意味着如果左边的操作数是假的,右边的代码永远不会执行。这叫做short circuit evaluation.

这对于仅在某些值是真实的情况下才做某事非常方便。

// someAction will only be executed if condition is true.
condition && someAction()

链接时你可以这样想:Return第一个虚假值,如果nonereturn最后一个值。

const a = 1
const b = 0
const c = 'qwerty'
const foo = a && b && c && 'test'

在这个例子中 foo0,因为这是链中的第一个假值。

但是,在这段代码中:

const a = 1
const b = 2
const c = 'qwerty'
const foo = a && b && c && 'test'

footest 因为所有值都是真实的,所以最后一个值是 returned。


在 React 中,它通常用于有条件地渲染组件。例如:

{ currentUser && hasAccessToContactInfo && <ContactInfo user={currentUser} /> }

这是可行的,因为 React 不会渲染大多数*虚假值,所以如果 currentUserfalse,那么整个表达式的计算结果为 { false },它不会渲染任何东西。

这很好,因为它允许在普通 javascript 中有意义的模式在 React 渲染中也有意义。

* React 肯定会将 0 呈现为文本节点,这是有道理的。它也可能将 '' (空字符串)呈现为空文本节点。但是大多数对渲染没有意义的虚假值都会像您期望的那样被忽略。

当然,这叫做条件渲染,它在 React 上 documentation

如果你有很多构成条件的字段,我建议将它们提取到一个函数中以提高可读性:

const shouldRenderX = () => aField && aFunc() && aVal > another;
...
{ shouldRenderX() && <X>... }