为什么这对每个虚假但无效的东西都起作用?
function bouncer(arr) {
for(let i = 0; i < arr.length; i++){
if(!arr[i]){
arr.splice(i,1);
i = 0;
}
}
console.log(arr);
}
bouncer([false, null, 0, NaN, undefined, ""])
答案 0 :(得分:1)
由于在for
循环中出现的最终表达式,此处的i++
将始终在循环体之后执行。因此,根据当前逻辑,无论输入数组是什么,i
只会在循环主体的开始处0
处于第一次迭代期间:
function bouncer(arr) {
for (let i = 0; i < arr.length; i++) {
console.log('i:', i);
if (!arr[i]) {
arr.splice(i, 1);
i = 0;
}
}
console.log(arr);
}
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
您可以将i
重置为-1
,从而导致i++
在下一个循环主体的开始处将i
变成0
:>
function bouncer(arr) {
for (let i = 0; i < arr.length; i++) {
console.log('i:', i);
if (!arr[i]) {
arr.splice(i, 1);
i = -1;
}
}
console.log(arr);
}
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
或者,当然,可以使用.filter
来代替,.filter
的原因要容易得多:
const bouncer = arr => arr.filter(Boolean);
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
答案 1 :(得分:1)
或者你可以使用
function bouncer(arr){
return arr.filter(Boolean);
}
答案 2 :(得分:0)
只需在 CertainPerformance 给出的答案中添加更多内容,您还可以处理循环体内i
的增量,如下所示:
function bouncer(arr)
{
for (let i = 0; i < arr.length;)
{
console.log('i:', i);
if (!arr[i])
arr.splice(i, 1);
else
i++;
}
return arr;
}
console.log(bouncer([false, null, 0, "Some value", NaN, undefined, ""]));