模运算符前的双水平线

double horizontal line before modulus operator

本文关键字:水平线 运算符      更新时间:2023-09-26

我了解模运算符的作用。但是双线在"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;

这是一个类似于您可能熟悉的++的运算符。它的目的是在返回一个值后将该值递减一。如果减是在值之前写入的,则递减将在返回值之前发生。

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问题中的代码实际上非常精致,因为它利用运算顺序将递减和比较组合到同一行中。因为这是一个后缀递减,所以直到对模数运算符求值之后才会发生递减。

这两者将返回相同的值:

  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