2016-05-17 22 views
1

我明白模數運算符的作用。但是雙線在「n--%2」中做了什麼?這應該很簡單,但我卡住了。模數運算符之前的雙水平線

function padIt(str, n) { 
 
    while (n > 0) { 
 
    str = n-- % 2 ? '*' + str : str + '*'; 
 
    } 
 
    return str; 
 
} 
 

 
document.write(padIt("a", 10));

+0

它是一個遞減操作 –

回答

2

n--返回n的值,然後將它減。

var result = n-- % 2; 

相當於

var result = n % 2; 
n = n - 1; 
0

它類似於一個運營商,你可能熟悉++。它的目的是在返回所述值之後將值減1。如果在該值之前寫入了小值,則在返回值之前會發生遞減。

var a = 12; 
console.log(--a); //=> 11 

對戰:

var a = 12; 
console.log(a--); //=> 12 
// But if you use a below this code it's value will be 11. 
0

我想的東西是從答案失蹤至今,在OP的問題的代碼其實是相當精緻的,因爲它利用了order of operations減量和結合比較成同一行。因爲這是一個後綴減量,所以在模算子被評估之後纔會發生遞減。

這兩個將返回相同的值:

n=10; 
    n % 2; //0 
--------------- 
    n=10; 
    n-- % 2; //0 

但要做出這樣的前綴減量,或使用括號強制後綴縮減器首先要評估會改變這一結果:

n=10; 
    --n % 2; // 1 
--------------- 
    n=10; 
    (n--) % 2; // 1 

在OP的問題中重寫函數的更詳細的方式是

function padIt(str, n) { 
    while (n > 0) { 
    str = n % 2 ? '*' + str : str + '*'; 
    n = n - 1; // This is the decrementer fully written out 
    } 
    return str; 
} 

不,它不會顯着延長代碼,但確實節省了額外的一行。但更重要的是,找到像這樣聰明的小技巧真酷。歡呼這個功能的作者!

FIDDLE的示範