Javascript 带大括号的代码和不带大括号的代码之间的区别

Javascript 带大括号的代码和不带大括号的代码之间的区别,javascript,arrow-functions,Javascript,Arrow Functions,当我在javascript函数中使用大括号时,我得到了一个意想不到的结果。我想看看是否有人能帮我理解发生了什么 const ages = [3, 10, 18, 20] let x x = ages.some( (a) => a===18) // x is true x = ages.some( (a) => {a===18}) // x is false 不知道为什么在我添加大括号时x结果为false。有人能解释一下吗?如果没有大括号,函数体将被限制为一个表达式,返回值将自动

当我在javascript函数中使用大括号时,我得到了一个意想不到的结果。我想看看是否有人能帮我理解发生了什么

const ages = [3, 10, 18, 20]
let x
x = ages.some( (a) => a===18)  // x is true
x = ages.some( (a) => {a===18})  // x is false

不知道为什么在我添加大括号时x结果为false。有人能解释一下吗?

如果没有大括号,函数体将被限制为一个表达式,返回值将自动成为该表达式的结果

但是使用
{
}
时,函数的行为与任何其他代码块类似:除非使用显式
return
语句,否则它不会隐式返回值(即,它的计算结果为
未定义的


(x)=>x+1
相当于
(x)=>{return x+1;}
使用大括号时,必须返回结果,否则返回未定义,这意味着
{a==18}
将始终被视为false。 你应该写

x = ages.some( (a) => {return a===18})

=>
如果没有花括号,它将返回
a===18
布尔值


但是在第二种情况下,你需要像
x=ages那样返回那个值。一些((a)=>{returna==18})
箭头函数有一个叫做隐式返回的东西

因此,如果您编写一个表达式作为arrow函数的主体,它将自动返回结果

因此,对于
x=age.some((a)=>a==18)
,检查结果将自动返回
a==18
。就像你写了
x=ages.some((a)=>{returna==18;})一样

对于带括号的版本,您不添加返回值,因此它始终返回未定义的值,即使a等于18。您需要显式返回以使其如上所示工作

如果回调函数中至少有一个元素返回
true
,则该函数将返回
true
。在没有括号的情况下,第三个数组元素返回true,其他元素返回false,从而导致变量
x
返回
true


在带括号的版本中,由于函数不返回任何内容,因此始终返回
undefined
。Undefined会将所有值转换为false,因此,最终结果是变量
x
也是false。

下面是一个很好的例子,说明了用JS编写函数的不同方式以及它们的工作方式。但是基本上要记住,没有大括号的箭头函数只是
return
的缩写

()=>{return'foo';}
()=>'foo'相同

//无返回值的常规函数
变量a=‘bar’;
常量myFunc1=function(){a='foo';}
log(myFunc1(),a);
//带返回值的正则函数
a=‘bar’;
const myFunc2=函数(){return a='foo';}
log(myFunc2(),a);
//带返回值的arrow函数
a=‘bar’;
常量myFunc3=()=>{return b='foo';}
log(myFunc3(),a);
//无返回值的arrow函数
a=‘bar’;
常量myFunc4=()=>{b='foo';}
log(myFunc4(),a);
//使用速记的arrow函数,它有一个隐式返回值
a=‘bar’;
常量myFunc5=()=>b='foo';

log(myFunc5(),a)无大括号=自动返回结果,大括号=显式要求
返回
语句。所以在使用大括号的示例中,每次。。。因为您需要显式地编写
return
,我真的怀疑这个问题是否需要答案,而且可能是重复的。@kemicofa找到一个令人信服的重复,我会投赞成票。