Javascript react redux mapStateToProps圆括号

Javascript react redux mapStateToProps圆括号,javascript,reactjs,redux,Javascript,Reactjs,Redux,为什么mapStateToProps在props对象周围有这些圆形的()括号? 那是一种生活还是类似的 const mapStateToProps = state => ({ auth: state.auth }); 在arrow函数中,您可以通过不使用像这样的{}括号来返回一些值 const mapStateToProps = state => state; 这意味着mapstatetops将返回state 如果要从该函数返回对象,则需要将该对象括在()括号中。这样它就知道

为什么
mapStateToProps
在props对象周围有这些圆形的
()
括号? 那是一种生活还是类似的

const mapStateToProps = state => ({
  auth: state.auth
});

在arrow函数中,您可以通过不使用像这样的
{}
括号来返回一些值

const mapStateToProps = state => state;
这意味着
mapstatetops
将返回
state

如果要从该函数返回对象,则需要将该对象括在
()
括号中。这样它就知道它正在返回一个对象,而不是创建一个函数定义

const mapStateToProps = state => ({
  auth: state.auth
});
因此在上面的代码中,
MapStateTops
将返回一个对象(即
{auth:..}


查看更多信息

这是一个简单的构造,用于指示隐式返回()中的内容


它不是IIFE

正则函数表达式或函数声明具有块语句部分作为函数体:

为了更好地理解这个主题,让我们首先检查一下我们的定义:

:

JavaScript应用程序由具有适当语法的语句组成。一条语句可以跨越多行。如果每条语句用分号分隔,则可能在一行中出现多条语句。这不是一个关键字,而是一组关键字

例如:

x && y;
x + y;
x,y;
while(something) {}
if (whatever) {}
const y = 1;

{
   y();
   const y = 2;
   if (x) {
     console.log(x);
   }
}
var str = "";

loop1:
for (var i = 0; i < 5; i++) {
  if (i === 1) {
    continue loop1;
  }
  str = str + i;
}

console.log(str);
// expected output: "0234"

块语句(或其他语言中的复合语句)用于将零个或多个语句分组。块由一对花括号分隔,并且可以选择标记

例如:

x && y;
x + y;
x,y;
while(something) {}
if (whatever) {}
const y = 1;

{
   y();
   const y = 2;
   if (x) {
     console.log(x);
   }
}
var str = "";

loop1:
for (var i = 0; i < 5; i++) {
  if (i === 1) {
    continue loop1;
  }
  str = str + i;
}

console.log(str);
// expected output: "0234"
有些陈述可以是:

带标签的语句可以与break或continue语句一起使用。它是在语句前面加上一个标识符,您可以引用该标识符

例如:

x && y;
x + y;
x,y;
while(something) {}
if (whatever) {}
const y = 1;

{
   y();
   const y = 2;
   if (x) {
     console.log(x);
   }
}
var str = "";

loop1:
for (var i = 0; i < 5; i++) {
  if (i === 1) {
    continue loop1;
  }
  str = str + i;
}

console.log(str);
// expected output: "0234"
Arrow函数允许编写表达式语句而不是块语句作为其主体。这就是为什么它不同于常规函数以及为什么它如此受欢迎的原因之一

现在,出于示例的目的,让我们尝试:

const mapStateToProps = state => {
  auth: state.auth
};
当您在这里使用
{}
时,您可能不是指块语句,而是指带有属性键和值的
{a:1,b:2}

但是js编译器看到一个语句,它恰好是一个块语句,因此将其中的所有内容解析为语句,这就是为什么 您的
auth:state.auth
被解析为带标签的语句

现在,当编译器看到以下内容时:

const mapStateToProps = state => ({
  auth: state.auth
});

或者除了你命名的block语句之外的任何语句,它试图将下面的语句作为表达式语句处理

arrow函数返回表达式返回的内容,例如

x = () => a = 1
a=1
part被视为赋值表达式,它本身返回1

()
开始,它将 操作数作为表达式,并返回其计算结果,如所述

圆括号表达式:(表达式) 返回计算表达式的结果。这可能是参考类型

因此我们的
({
auth:state.auth
})
被编译为一个对象文字表达式,经过计算后,该表达式将基础对象返回给调用
MapStateTops
的人


希望这能澄清一点。

如果在一行中指定,则fat arrow后面的内容将隐式返回
Nope。它将返回
未定义的
。您是对的。编辑ITA随着JS的不断发展,似乎有人接受了一些语言(C,Python,Java…)和一些想法(字典,函数式编程范例…),他们把它放在一个搅拌机里,并且认为世界将产生足够多的初级程序员来整理混乱的语法和成为汤的想法。真是一团糟。@eSurfsnake好吧,这就是你在设计一种强大而灵活的动态语言时所付出的代价。它很复杂,像java,C++。但是它是一个独立的解决方案,与前面提到的语言处于同一水平,许多才华横溢的人不知疲倦地努力使它变得更好,而且根据最新的规范版本,他们已经取得了很大的成功。我认为说有人正在“设计”一种非常强大和灵活的语言是言过其实的。很明显,最初的语言是一种黑客行为,在旧的油漆层上不断添加东西。像Lisp、Haskell和C这样的语言显然有一个预先考虑好的设计思想;JS是达尔文主义进化论的狂潮——因此需要如此多的库和预处理器。