为什么这个ES6默认参数值不能给出所需的结果?

时间:2017-07-04 06:48:55

标签: javascript ecmascript-6 default-parameters

我在一本书中找到了这个ES6代码:

let value = 5;

function getValue() {
    return value++;
}

function add(first, second = getValue()) {
    return first + second;
}

console.log(add(1, 1));     // 2
console.log(add(1));        // 6

为什么运行console.log(add(1));返回6作为值,这意味着它将参数second作为5,尽管我的代码明确指定getValue函数应返回{{1} } - 这意味着第一次运行时,value++函数应该返回6并且getValue应该返回7.我在Firefox控制台中运行此代码 - 我错过了什么?

5 个答案:

答案 0 :(得分:1)

value++

在增加之前获取值,你应该做

++value

value+=1;
return value

答案 1 :(得分:1)

默认参数are evaluated at call time,意味着每次调用getValue 时函数add都会调用 - 而不是在最初运行代码时。由于您使用了后缀增量,getValue将在您第一次调用add时返回5,然后返回6,7等。后缀增量返回先前的值,然后递增,例如:< / p>

var x = 5
var foo = x++;

此处,foo的值为5,然后x递增。因此,在您的示例中,getValue函数实际上返回5而不是6,然后在您第一次调用它时递增value。如果你想要6,7,8,请使用前缀增量,在增量后返回值

++x;

这将增加value,然后返回该增量值。你甚至可以使用化合物添加:

x += 1;

这会在您再次访问之前明确重新分配x。进一步阅读这些运营商here

答案 2 :(得分:1)

因为您使用后缀表达式,如果您使用前缀表达式,那么您将获得7。

Airthmetic operators

&#34;如果使用postfix,操作符后面的运算符(例如,x ++),则它在递增之前返回值。 如果在操作数之前使用带有运算符的前缀(例如,++ x),则在递增&#34;之后返回值。

答案 3 :(得分:1)

我认为您的问题与ecmascript-6无关,但却无法正确理解++运算符。

根据documentation

  

一元运算符。在其操作数中添加一个。如果用作前缀运算符   (++ x),在加1后返回其操作数的值;如果用作   postfix operator(x ++),在添加之前返回其操作数的值   之一。

value++++value替换value + 1可以解决您的问题。

答案 4 :(得分:-1)

嗨,这称为'Default value'参数。这意味着您可以为函数定义中的每个参数设置默认值。

function add(first, second = getValue()) {
    return first + second;
}

在这种情况下&#39; second = getValue()&#39;,&#39; getValue()&#39;是第二个&#39;参数的defulat值。

当你做

console.log(add(1, 1));     // 2

因为
第一==→1 第二==→1

console.log(add(1));        // 6

,因为 第一==→1 second ==&gt; getValue()===&gt; 6