如果我有一个我想循环的数组= [8,7,6,5,4],为什么以下for循环仍然有效,但数组的长度是5,并且在索引5处没有元素阵列?
for(let i=array.length;i>=0;i++){
//do something
}
我知道从长度中减去1会更准确,但为什么上面的代码仍然有效
几乎。你必须:
i
而不是增加它,并且array.length-1
开始,因为数组索引从0开始,而不是1。所以改用:
for (let i = array.length-1; i >=0 ; i--) {
它发生原因Javascirpt中的数组不限于它们声明的大小。因此,它暗示如果您尝试访问空位置,您将收到未定义的。例如,在这种情况下,如果你做array[5]
,你将收到undefined
而不是像Java中那样的ArrayIndexOutOfBoundsException
。
另外,您应该查看代码。由于你向后迭代数组,你可以用i
减去i--
而不是递增它。
因为它是这样的:
const array = [1,2,3,4];
for(let i=10;i>=0;i--){
console.log(array[i]);
}
你可以随心所欲地骑自行车。在javascript中,一切都是对象,包括数组。使用[]
访问对象中不存在的内容将返回undefined。
for(let i=array.length-1;i>=0;i--){
//do something
}
你需要将i
设置为数组-1的长度(因为数组索引从0开始)。然后每次你完成循环你需要从i
(i--
)中减去一个
您的代码有效,但会在循环中运行很多次,直到数字溢出为负数。尝试将console.log(i)添加到循环中以查看我的意思。 (如果你在检查员中这样做,它可能会冻结铬)
Array的长度等于假设它们都已满的条目数。稀疏数组的长度不是其中的元素数,而是基于它们中的最大索引
例如:
let a = [];
a[10] = 1;
console.log(a.length);
console.log(a);
长度为11(0到10),你可以看到undefined
的值为0到9。
即使将最后一个值设置为undefined
也不会影响长度,因为在该位置仍然存在undefined
的值。
let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);
a[10] = undefined
console.log(a.length);
使用删除仍然不会影响长度。
let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);
delete a[10];
console.log(a.length);
更改长度的唯一方法是创建一个新数组作为原始子集:
let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);
console.log(a);
a = a.slice(0,9);
console.log(a.length);
console.log(a);