Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法理解此javascript解构语句_Javascript_Reactjs_Redux - Fatal编程技术网

无法理解此javascript解构语句

无法理解此javascript解构语句,javascript,reactjs,redux,Javascript,Reactjs,Redux,我正在处理一个react/redux示例项目,由于我对Javascript有点陌生,我接触到的一些缺乏人手的ES6JavaScript是有限的。 我有困难的陈述如下: function mapStateToProps(state) { const { selectedSubreddit, postsBySubreddit } = state; // This part here is confusing to me const { isFetching, lastUpdated,

我正在处理一个react/redux示例项目,由于我对Javascript有点陌生,我接触到的一些缺乏人手的ES6JavaScript是有限的。 我有困难的陈述如下:

function mapStateToProps(state) {
  const { selectedSubreddit, postsBySubreddit } = state;

  // This part here is confusing to me
  const { isFetching, lastUpdated, items: posts } = postsBySubreddit[
    selectedSubreddit
  ] || {
    isFetching: true,
    items: []
  };

  return {
    selectedSubreddit,
    posts,
    isFetching,
    lastUpdated
  };
}
我基本上理解这个函数的目的,但我不确定我有评论的那部分是怎么回事

到目前为止,我收集的是postsBySubreddit是一个数组,我们根据selectedSubreddit从中获取元素。从该元素中,我们正在“提取”
isFetching
lastUpdated
,以及
(同时将其别名为
posts
)。让我感到不舒服的是
|
操作符和它后面的大括号中的语句

这是一种病态吗?如果是,我们是说如果postsBySubreddit[selectedSubreddit]===undefined,我们给的是获取true的值和一个空数组吗?

您的理解几乎是正确的。在使用
|
操作符之前,您是正确的。但是对于
|
操作符

如果postsBySubreddit[selectedSubreddit]=未定义,我们将为isFetching赋值为true,而items为空数组

如果
postsBySubreddit[selectedSubreddit]
是错误的,例如
0
'
false
null
未定义
NaN
。请注意,
[]
{}
是真实的。(为了方便检查您是否忘记了,您可以在dev控制台或节点解释器中键入
!!NaN

设a=b | | c
等于:

let a;
if (b)
  a = b;
else
  a = c;
类似地,
让a=b |{x:0,y:1}
等价于

let a;
if (b)
  a = b;
else
  a = {x: 0, y: 1};

|
运算符意味着如果前一条语句为false,则运行下一条语句

看看这个:

if (thing == "ok" || otherthing == "notok") {
我想你知道这意味着什么。如果任一语句为
true
,则输入块。它“运行”的方式是首先检查左语句(
thing==“ok”
),如果为false,则运行下一条语句(
otherthing==“notok”

同样的事情也可以分配给变量:

var result = thing == "ok" || otherthing == "notok";
如果left或right语句返回
true
,那么这个函数将使结果成为
true
,逻辑与我上面解释的相同

现在,如果我们进一步使用这个逻辑,我们可以做到:

var result = FIRST_STATEMENT || SECOND_STATEMENT;
这将运行
FIRST_语句
,获取值并检查是否为
false
。如果结果不是false,将运行
第二个\u语句
并返回值。如果
第一个\u语句
不是
false
,则将返回该值(因为不会运行
第二个\u语句

简而言之
|
操作符将从左到右计算语句,并返回第一个非
false的语句

PD:请注意,
null
未定义
NaN
0
false
语句相同


PD2:为了澄清这一点,这些值之间没有三重相等(
==
)。

在case
postsBySubreddit[selectedSubreddit]中有
|
未定义的
您可能是指解构语句。请阅读正在发生的事情的答案,但请记住,对于解构
常量{isFetching=true,lastUpdated,items:posts=[]}=postsBySubreddit[selectedSubreddit]
只需添加一件事。。。在javascript中,
if(b)
返回
false
if b===false或者如果b为空-其中没有任何值。因此,这是一种始终返回非空值的方法。