箭头函数中的JavaScript扩展运算符
这段JavaScript代码提醒1作为答案。有人能解释一下这段代码是如何执行的吗箭头函数中的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”,因为当+的任一操作数不是基元(数组不是基元)时,它被强制为基元,而将
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]不使用code>,因为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所期望的是什么。哦,是的!参数是函数中的局部范围。