ES6默认参数:未正确分配的值

时间:2017-02-25 16:25:09

标签: javascript ecmascript-6 default-parameters

我正在玩ES6默认参数,我有一个奇怪的行为。

以下是问题的一个简短示例:

function test(firstValue, secondValue=5){
  console.log("firstValue: " + firstValue);
  console.log("secondValue: " + secondValue);
  console.log("----------")
}

test(2, secondValue = 3)
test(secondValue = 3)

及其输出:

firstValue: 2
secondValue: 3
----------
firstValue: 3
secondValue: 5
----------

在第二种情况下,我预计firstValue: undefinedsecondValue: 3。这种行为是否正常。我想念一下吗?

3 个答案:

答案 0 :(得分:5)

当你这样做时

test(2, secondValue = 3)

你实际上是这样做的:

secondValue = 3
test(2, 3)

由于The Horror of Implicit Globals,第一部分(secondValue = 3)创建了一个名为secondValue的全局变量。*它与函数中的secondValue参数无关。 JavaScript没有命名参数。 (例如,你不能说'#34;这里是secondValue"的值,除非把它放在参数列表中的正确位置,否则进行调用。如果你想要在进行调用时指定名称,可以使用解构为cubbuk points out,这不是真正命名的参数,但可以用于相同的目的。)

第二部分(将3传递给test)的发生是因为作业的结果是指定的值(因此secondValue = 3secondValue设置为{{1}然后输入值3,然后将其传递到3)。

testtest3,请执行此操作。 E.g:

secondValue

如果要关闭第二个,将使用默认值:

test(2, 3);

示例:



test(2);




* (这是我贫穷的小博客上的帖子)

答案 1 :(得分:1)

您正在使用全局变量而未声明它。赋值生成一个全局变量,不会影响函数test的变量。这些局部变量与调用范围无关。

function test(firstValue, secondValue=5){
  console.log("firstValue: " + firstValue);
  console.log("secondValue: " + secondValue);
  console.log("----------")
}

var secondValue; // with declaration
console.log(secondValue);
test(2, secondValue = 3)
test(secondValue = 3)
console.log(secondValue);

答案 2 :(得分:1)

你想做解构我猜:



function test({firstValue, secondValue = 5} = {}){
  console.log("firstValue: " + firstValue);
  console.log("secondValue: " + secondValue);
  console.log("----------")
}

test() // prints firstValue: undefined, secondValue: 5
test({}) // prints firstValue: undefined, secondValue: 5
test({firstValue: 2}) // prints firstValue: 2, secondValue: 5
test({secondValue: 3}) // prints firstValue: undefined, secondValue: 3