有人可以解释为什么这行不通吗:
function filterNumbers(arr) {
for (var i = 0; i < arr.length; i++) {
if(typeof arr[i] !== 'number') {
arr.splice(i, 1);
}
}
}
但这确实是:
function filterNumbers(arr) {
for (var i = arr.length - 1; i >= 0; i--) {
if (typeof arr[i] !== 'number') {
arr.splice(i, 1);
}
}
}
对我来说,功能似乎是相同的,我无法理解。
我正在测试的输入数组是:
var arr = [1, 'a', 'b', 2];
最佳答案
每个人都没有直接回答您的问题,而是继续指长度。
您的代码:
function filterNumbers(arr) {
for (var i = 0; i < arr.length; i++) {
if(typeof arr[i] !== 'number') {
arr.splice(i, 1);
}
}
}
问题在于
i
所引用的内容(它在长度方面确实起着作用,但它们没有进一步解释)。当i
为1时,您引用的是数组的a
。然后,将其从数组中拼接出来,该数组现在有1个引用“ b”。在完成迭代之前,它仍然在for循环内。然后,将i
从1(现在正在引用b
)增加到2,然后在数组中引用2
。您可以通过使数组为所有字母来进一步测试,然后您将看到如何跳过其他所有字母(
['a', 'b', 'c', 'd', 'e', 'f']
将导致['b', 'd', 'f']
)。要解决该问题,您必须根据循环内的操作来增加/减少
i
。如果进行拼接,请在循环中递减i
或抛出else语句,并在else语句内而不是每次迭代后增加i
值。
关于javascript - 为什么我可以遍历数组而不是遍历-Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004456/