2017-07-04 86 views
2

我發現了一本書,這ES6代碼:爲什麼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函數返回value++ - 這意味着它第一次運行時,getValue函數應該返回6並且add應該返回7.我在Firefox控制檯中運行此代碼 - 我錯過了什麼嗎?

回答

1

默認參數are evaluated at call time,這意味着功能getValue每次調用add時調用 - 不是代碼初始運行時。由於您使用的後綴增量,getValue將返回5第一次調用add,則6,7,等後綴增量返回以前的值,然後遞增,例如:

var x = 5 
var foo = x++; 

這裏,foo是給定值5,x遞增。因此,在您的示例中,getValue函數實際上返回5而不是6,然後在第一次調用時遞增value。如果你想6,7,8,使用前綴增量遞增哪個後返回值

++x; 

這將增加value,然後返回增加後的值。你甚至可以使用添加化合物:

x += 1; 

這明確地重新分配x你再次訪問它。進一步閱讀這些運營商here

+0

它不適用於後綴表達式,這是因爲函數定義中的默認值。 –

+0

@FarhadAzarbarzinniaz該函數返回後綴增量的結果?您的評論不正確。這正是原因。 – Li357

+0

謝謝@AndrewLi,@LorenzoCatalano,@AbdullahDanyal幫助我理解。不過,我想知道後綴運算符的用法是什麼。是不是更好地默認爲前綴運算符,並根據是否希望數字從5或6開始更改'value'的值 – Mortz

1
value++ 

得到值增加它之前,你應該做的要麼

++value 

value+=1; 
return value 
1

因爲您使用了後綴表達式,如果你使用前綴表達式那麼你將得到7

Airthmetic operators

「如果使用的後綴,與運營商的操作數後(例如x ++) ,那麼它在返回之前返回值 如果在操作數之前使用了運算符的前綴(例如,++ x),那麼它會在增加後返回值「。

1

我相信你的問題與ecmascript-6沒有關係,但是不能正確理解++運營商。

按照documentation

元運算符。向其操作數添加一個。如果用作前綴運算符 (++ x),則在添加1之後返回其操作數的值;如果用作 後綴運算符(x ++),則在添加 之前返回其操作數的值。

與任何++valuevalue + 1更換value++應該解決您的問題。

-1

嗨,這被稱爲'Default value'的參數。這意味着您可以在函數定義中爲每個參數設置默認值。

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

在這種情況下'second = getValue()','getValue()'是'second'參數的defulat值。

當你

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

因爲
第一==> 1 第二==> 1

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

因爲 第一==> 1 第二==>的getValue() ===> 6

+0

我認爲OP顯然知道默認參數是什麼...... – Li357

+0

@AndrewLi你確定嗎?我想知道你是如何在盲人中徘徊的。請閱讀問題。他在JS6中是新的。 –

+1

我看過這個問題 - 他們明白這是什麼,甚至包括名字。問題是關於爲什麼他們得到6而不是7,這是*因爲後綴增量運算符* ... – Li357

相關問題