我理解模数运算符的作用。但是双线在“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;
答案 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.
答案 2 :(得分: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进行演示