我明白模數運算符的作用。但是雙線在「n--%2」中做了什麼?這應該很簡單,但我卡住了。模數運算符之前的雙水平線
function padIt(str, n) {
while (n > 0) {
str = n-- % 2 ? '*' + str : str + '*';
}
return str;
}
document.write(padIt("a", 10));
我明白模數運算符的作用。但是雙線在「n--%2」中做了什麼?這應該很簡單,但我卡住了。模數運算符之前的雙水平線
function padIt(str, n) {
while (n > 0) {
str = n-- % 2 ? '*' + str : str + '*';
}
return str;
}
document.write(padIt("a", 10));
n--
返回n的值,然後將它減。
var result = n-- % 2;
相當於
var result = n % 2;
n = n - 1;
它類似於一個運營商,你可能熟悉++
。它的目的是在返回所述值之後將值減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.
我想的東西是從答案失蹤至今,在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的示範
它是一個遞減操作 –