在ES6中使用默认值和展开语法

4

在学习JavaScript特性时,我在同一个函数中使用了默认参数和扩展语法。

let whatIsThis = (a, b = 2, ...c) => {
    console.log("a = " + a, "b = " + b,"c = " + c)
}

whatIsThis(a = 1, c = [2,3,4,5,6,7,8])

运行后,我期望输出结果如下:
"a = 1"
"b = 2"
"c = 2,3,4,5,6,7,8"

但实际上我得到了这个:
"a = 1"
"b = 2,3,4,5,6,7,8"
"c = "

为什么这个没有起作用?

你不能通过它的名称来引用函数的参数。这些名称不会暴露给外部作用域。 - Nina Scholz
5个回答

6

这是因为在JavaScript中无法将命名参数传递给函数。当您执行whatIsThis(a = 1, c = [2,3,4,5,6,7,8])时,它的真正含义是whatIsThis(1, [2,3,4,5,6,7,8])(因为a = 1语句返回1)。

您可以将默认参数移动到最后(通常是一个好习惯),或者将参数包装在对象中。例如:

let whatIsThis = ({a, b = 2, c}) => {
    console.log("a = " + a, "b = " + b,"c = " + c)
}

whatIsThis({a: 1, c: [2,3,4,5,6,7,8]})

1
你可以在第二个参数中使用undefined,并对所有使用rest parameters ...收集的其他参数使用spread syntax ...

JavaScript没有命名参数。

您需要按照函数签名的顺序传递参数。

let whatIsThis = (a, b = 2, ...c) => {
  console.log("a = " + a, "b = " + b, "c = " + c)
}

whatIsThis(1, undefined, ...[2, 3, 4, 5, 6, 7, 8])
//            ^^^^^^^^^                             takes default value
//                       ^^^^^^^^^^^^^^^^^^^^^^^^   spreads values for rest parameters


为什么需要使用展开语法?我认为 whatIsThis (1, undefined, [2,3,4,5,6,7,8]) 也能正常工作。 - Karan Dhir
@KaranDhir,确实会返回一个嵌套数组(也许是想要的,也许不是)。 - Nina Scholz

0
Javascript没有“命名参数”。参数仅基于位置分配给参数。您不能按名称分配参数,也不能简单地跳过“b”参数。这样:
whatIsThis(a = 1, c = [2,3,4,5,6,7,8])

等同于:

a = 1;
c = [2,3,4,5,6,7,8];
whatIsThis(a, c);

a = 1 这里是一个赋值操作,创建了一个新的全局变量;它与函数的参数 a 没有任何关系。


0

你需要调用 whatIsThis(a = 1, undefined , c = [2,3,4,5,6,7,8]),因为你在函数参数的中间使用了默认参数,所以应该将其调用为 undefined 以使用默认值。

let whatIsThis = (a, b = 2, ...c) => {
    console.log("a = " + a, "b = " + b,"c = " + c)
}

whatIsThis(a = 1, undefined , c = [2,3,4,5,6,7,8])


0

函数参数的顺序很重要。在这种情况下,函数的顺序为(a, b = 2, ...c),但是函数只使用两个参数whatIsThis(a = 1, c = [2,3,4,5,6,7,8])进行调用。

因此,当函数被调用时,参数c基本上是未定义的,而参数b指的是数组[2,3,4,5,6,7,8]

还要注意,像whatIsThis(a = 1, c = [2,3,4,5,6,7,8])这样调用函数会导致某些代码检查工具和IDE报错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接