模数运算符前的双水平线

时间:2016-05-17 15:17:47

标签: javascript modulus

我理解模数运算符的作用。但是双线在“n--%2”中做了什么?这应该很简单,但我被卡住了。

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

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

3 个答案:

答案 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进行演示