我明白模数运算符的作用。但是双线在“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的示范
它是一个递减操作 –