随机遇到此问题。当我将array.length存储在变量中并使用运算符<=应用于for循环条件时,循环工作正常,但是当我将array.length与相同的运算符一起使用时,它就变成了无限。
function map(array, callback) {
let k =array.length;
for(let i= 1; i<=k; i++)
{
array[i] = callback(array[i]);
}
return array;
}
console.log(map([1, 2, 3], addTwo));
这按预期工作。但是当我使用
function map(array, callback) {
for(let i= 1; i<=array.length; i++)
{
array[i] = callback(array[i]);
}
return array;
}
console.log(map([1, 2, 3], addTwo));
当然i=0; i<array.length;
是这样做的方法。但是我很好奇里面发生了什么。
答案 0 :(得分:2)
在第一种情况下,具有长度的变量不会更改,但是在第二种情况下,您可以直接获取长度并进行更改。
let k = array.length;
保留一段长度,直到迭代器达到大于k
的索引为止。
另一个
for (let i = 1; i <= array.length; i++)
// ^
取实际长度,然后将索引与长度进行比较,从而为原始数组末尾的每次调用都向该数组添加一个索引。
答案 1 :(得分:0)
如果在其中添加console.log
,您可以轻松查看会发生什么情况:
let addTwo = x => x + 2
function map(array, callback) {
for (let i = 1; i <= array.length; i++) {
console.log(i, array.length) // <-- print out i and the length of the array
array[i] = callback(array[i]);
if(i==5) // <-- so we do not run out of memory
return false
}
return array;
}
console.log(map([1, 2, 3], addTwo));
最重要的是,只要for loop
小于或等于i
,array.length
就应该继续前进,但同时i
到达数组的实际长度,我们都会继续都增加。 i
通过i++
和array.length
通过array[i] = callback(array[i]);
,因此看不到尽头。