2016-05-17 21 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的示范