箭头函数中的JavaScript扩展运算符

箭头函数中的JavaScript扩展运算符,javascript,Javascript,这段JavaScript代码提醒1作为答案。有人能解释一下这段代码是如何执行的吗 const b = [1,2,3]; const f = (a, ...b) => a+b; alert( f( 1 ) ); 这里发生了几件事。最主要的一点是,您正在跟踪b,因此函数外部的b不会在函数内部使用。相反,您在其中创建一个新数组(因为您使用了,…b)并将其分配给b参数。由于只使用一个参数调用f,因此该数组为空1+[]是“1”,因为当+的任一操作数不是基元(数组不是基元)时,它被强制为基元,而将

这段JavaScript代码提醒1作为答案。有人能解释一下这段代码是如何执行的吗

const b = [1,2,3];
const f = (a, ...b) => a+b;

alert( f( 1 ) );

这里发生了几件事。最主要的一点是,您正在跟踪
b
,因此函数外部的
b
不会在函数内部使用。相反,您在其中创建一个新数组(因为您使用了,
…b
)并将其分配给
b
参数。由于只使用一个参数调用
f
,因此该数组为空
1+[]
“1”
,因为当
+
的任一操作数不是基元(数组不是基元)时,它被强制为基元,而将数组强制为基元(间接)会导致对数组执行
.join(“,”
)。对于空白数组,
.join(“,”
。然后,因为其中一个操作数是字符串,所以另一个操作数(
1
)被强制为字符串(
“1”)
,它执行
“1”+”
,当然也就是
“1”
。(最后一位的详细信息。)

f(1)
1+[]

f(1,2,3)
1+[2,3]

就这些


第一行
常数b=[1,2,3],因为lambda表达式中的
b
是参数,而不是之前声明的常量。

您可以在函数调用中引用变量,但是,定义函数表达式时,参数名称不引用任何变量

如果像这样调用函数,您将得到预期的结果:

alert(f(1, b));
它将作为数组
b

虽然这是空的,但它会转换为空字符串,并且两个操作数都被视为字符串,因为如果一个操作数是字符串,则它会将所有值作为字符串相加

结果是
'1'

constb=[1,2,3];
常数f=(a,…b)=>a+“”;

控制台日志(f(1)类型)在我的浏览器的“开发工具”控制台中复制此代码如下所示:

> b = [1,2,3]
> f = (a, ...b) => a+b
> f(1)
< "1"
// so it results in the string 1, why's that?
// lets try logging what a and b are in the function
> g = (a, ...b) => console.log("a=%o, b=%o", a, b)
> g(1)
< a=1, b=[]
// ah, so b is an array, which is what the spread operator does 
// (gathers all remaining arguments into an array, so the question 
// is then what does JavaScript return for the number 1 added to an empty array?
> 1 + []
< "1"
>b=[1,2,3]
>f=(a,…b)=>a+b
>f(1)
< "1"
//结果是字符串1,为什么?
//让我们尝试记录函数中的a和b
>g=(a,…b)=>console.log(“a=%o,b=%o”,a,b)
>g(1)
 1 + []
< "1"

在不同类型上使用
+
运算符时,此行为是众多行为之一。

您还希望看到什么?您可能希望在函数
f
中记录
b
的值。
const f=
行上的
b
表示lambda范围中的一个新参数,它不引用
[1,2,3]
在父作用域中声明的数组。调用
f(1)
时,它不会将值绑定到可变参数
b
,因此它的值是空数组,在Javascript中是
1+[]==“1”
,因此是您的输出值。还要注意,
..
不是运算符(既不用于摊铺,也不用于休息)。而且不可能,运算符不能做spread或rest所做的事情。请参阅TJ的评论。@Li357-修复了它,感谢您标记它。这是因为TopPrimitive在使用时没有任何提示,数组的默认值是number,但TopPrimitive在具有提示number的数组上尝试
value of
然后
toString
。数组的
valueOf
返回的数组不是基元数组,因此使用了
toString
:感谢您的跟进!“如果您像这样调用函数,您将得到预期的结果:”嗯,我认为OP没有回答他/她期望什么的问题。但是请注意,如果你只是按照你的建议更改调用,
f
中的
b
将是
[[1,2,3]]
(注意,这是数组中的一个数组),结果将是
“11,2,3”
我非常怀疑OP所期望的是什么。哦,是的!参数是函数中的局部范围。