我在一本书中找到了这个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控制台中运行此代码 - 我错过了什么?
答案 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。
&#34;如果使用postfix,操作符后面的运算符(例如,x ++),则它在递增之前返回值。 如果在操作数之前使用带有运算符的前缀(例如,++ x),则在递增&#34;之后返回值。
答案 3 :(得分:1)
我认为您的问题与ecmascript-6
无关,但却无法正确理解++
运算符。
一元运算符。在其操作数中添加一个。如果用作前缀运算符 (++ 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