function range(start, end, st) {
var arr = [];
var counter = start;
while (counter <= end) {
arr.push(counter);
counter += st || counter + 1;
}
return arr;
}
console.log(range(1, 10));
这会产生意想不到的结果
但是这个:
counter = counter + st || counter + 1;
产生预期结果 知道为什么吗?
答案 0 :(得分:2)
我不确定您希望代码做什么,但counter += st || counter + 1
等同于
counter += (st || (counter + 1));
相当于
if(st) {
counter = counter + st;
}
else {
counter = counter + counter + 1;
}
另一方面counter = counter + st || counter + 1
相当于
counter = (counter + st ) || (counter + 1);
相当于
if(counter + st) {
counter = counter + st;
}
else {
counter = counter + 1;
}
所以他们做了很多不同的事情。我认为运算符优先级会让你失望。
答案 1 :(得分:1)
区别在于
counter += st || counter + 1;
与
相同counter = counter + (st || counter + 1);
而counter = counter + st || counter + 1
表示counter = (counter + st) || (counter + 1)
。
在您的示例中,代码st
为undefined
,因此循环有效地执行
counter += counter + 1;
每次都相当于
counter = counter * 2 + 1;
因此大跳过。
另一方面,在
counter = counter + st || counter + 1;
st
undefined
表示counter + st
为NaN
,计为错误,因此有效运行
counter = counter + 1;
相当于
counter += 1;
然而,这只是偶然的。如果使用不同的参数调用函数,例如:
function range(start, end, st) {
var arr = [];
var counter = start;
while (counter <= end) {
arr.push(counter);
counter = counter + st || counter + 1;
}
return arr;
}
console.log(range(-2, 2, 2));
&#13;
结果为[ -2, -1, 1 ]
,而不是预期的[ -2, 0, 2 ]
。
您可以通过
修复代码counter += st || 1;
代替。
答案 2 :(得分:0)
在您使用counter = counter + st || counter + 1;
的代码示例中,它完全符合编码,counter += st || counter + 1;
执行您想要的操作。如果您希望代码中包含较短的表单,则应使用counter += st || 1;
,因为这样可确保您不会将counter
添加到自身。