模运算符前的双水平线
double horizontal line before modulus operator
我了解模运算符的作用。但是双线在"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
相关文章:
- 这是什么 ==- javascript 运算符
- jQuery/JS包含运算符或类似运算符
- Javascript逻辑运算符和字符串/数字
- 模运算符前的双水平线
- jQuery's trim()的前缀为not运算符
- Javascript,如果条件在没有&&逻辑运算符当&&它不起作用
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 如何使用排列运算符来获取具有命名参数的函数的所有参数
- JavaScript 中三元条件和逻辑和运算符的运算符优先级
- 用于验证JS中逻辑运算符表达式的正则表达式
- 什么's是相当于LINQ's SelectMany运算符
- JavaScript-===vs===运算符性能
- 在 Jquery/Javascript 中使用多个 OR (||) 运算符时如何设置变量
- 三元运算符检查多个字符串
- 调用C++中JScript中的instanceof运算符(IDispatch/IDispatchEx)
- ||(OR)运算符如何在赋值中工作
- 在 JavaScript 对象中设置要使用的运算符的属性
- 哪个JavaScript相等运算符(==或===)更快
- 逻辑和/或运算符-意外的最终结果
- 扩展Nashorn-ecma引擎以添加新的运算符和类型