在ES6中使用默认值和传播语法

时间:2018-08-22 08:44:17

标签: javascript ecmascript-6 default-parameters spread-syntax

在浏览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 = "

为什么这没用?

5 个答案:

答案 0 :(得分:4)

这是因为您无法将命名参数传递给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 :(得分: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])

答案 2 :(得分:0)

JavaScript没有命名参数。仅根据位置 将参数分配给参数。您不能按名称分配参数 ,也不能简单地跳过class User < ApllicationRecord validates :username, presence: true # ... end 参数。这个:

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无关。

答案 3 :(得分:0)

您可以将undefined用于第二个参数,并将spread syntax ...用于使用rest parameters ...收集的函数的所有其他参数。

Javasscript没有命名参数。

您需要以与函数签名相同的顺序移交参数。

List<Client> clients1 = pc.getClients();
List<Client> clients2 =new ArrayList<Client>();

if (clients1 != null) {
    for (Client tc : clients1) {    
        tc.setClientId(tc.getClientId().replaceAll("\\p{C}", ""));
        tc.setClientName(tc.getClientName().replaceAll("\\p{C}", ""));
        tc.setCallFirstName(tc.getClientFirstName().replaceAll("\\{C}",""));
        clients2.add(tc);
    }
}

pc.setClients(client2)

答案 4 :(得分: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引发错误。