!!!在 for in 对数组的循环时 定义的 i 无法在循环体内 被更改!!
即 操作i 四则运算对下一次实际的 i 无效,依旧会按照 元素的下标依次顺序来
for in – for of 同理
案例一
for (i in [1,2,3]){
console.log('实际i',i)
i++
let a = i
console.log('下一次i',++a)
console.log('============')
}
// 忽略前方 VMxxx:xx
VM1781:2 实际i 0
VM1781:5 下一次i 2
VM1781:6 ============
VM1781:2 实际i 1
VM1781:5 下一次i 3
VM1781:6 ============
VM1781:2 实际i 2
VM1781:5 下一次i 4
VM1781:6 ============
案例二
let arr = [1,2,2,3]
for (let i in arr){
console.log('元素值:',arr[i])
console.log('实际i值:',i)
if(arr[i] == 2 ){
arr.splice(i,1)
// 此处i--,意味着下一次 i 依然和本次相同
// 因为splice 删掉了当前位元素,下一位的元素会补上来
i--
console.log('if后i值:',i)
}
let a = i
console.log('下一次i值应为:',++a)
console.log('==============')
}
console.log(arr)
元素值: 1
实际i值: 0
下一次i值应为: 1
==============
元素值: 2
实际i值: 1
if后i值: 0
下一次i值应为: 1
==============
元素值: 3
实际i值: 2
下一次i值应为: 3
==============
[1, 2, 3]
拓展–解决办法
用 for(i=0;i<xxx;i++) 时不存在上诉问题
let arr = [1,2,2,3]
for (let i=0;i<arr.length;i++){
console.log('元素值:',arr[i])
console.log('实际i值:',i)
if(arr[i] == 2 ){
arr.splice(i,1)
i--
console.log('if后i值:',i)
}
let a = i
console.log('下一次i值应为:',++a)
console.log('==============')
}
console.log(arr)
// 忽略前方 VMxxx:xx
VM1365:3 元素值: 1
VM1365:4 实际i值: 0
VM1365:11 下一次i值应为: 1
VM1365:12 ==============
VM1365:3 元素值: 2
VM1365:4 实际i值: 1
VM1365:8 if后i值: 0
VM1365:11 下一次i值应为: 1
VM1365:12 ==============
VM1365:3 元素值: 2
VM1365:4 实际i值: 1
VM1365:8 if后i值: 0
VM1365:11 下一次i值应为: 1
VM1365:12 ==============
VM1365:3 元素值: 3
VM1365:4 实际i值: 1
VM1365:11 下一次i值应为: 2
VM1365:12 ==============
VM1365:14 [1, 3]