为什么会这样?
let str = 'sSAo'
console.log(str[0], str[3]) // all good
for (let i in str) {
// why str[i+1] is undefined ???
console.log(i, str[i], str[i+1])
}
答案 0 :(得分:5)
问题在于for..in
循环遍历对象的属性名称。但是属性名称始终是字符串,而不是数字。因此,例如,在第一次迭代中:
str[i+1]
评估为
str['0'+1]
是
str['01']
相反,首先将i
强制转换为Number
:
let str = 'abcd'
for (let i in str) {
console.log(i, str[i], str[Number(i)+1])
}
答案 1 :(得分:3)
原因是i+1
不会像您期望的那样加上该值,该值为01,11,21,31
,这就是原因,您需要使用parseInt()
来做到这一点,
let str = 'sSAo'
console.log(str[0], str[3]) // all good
for (let i in str) {
// why str[i+1] is undefined ???
console.log(i, str[i], str[parseInt(i)+1]);//but the last one will still be undefined
}
答案 2 :(得分:2)
i
实际上是一个字符串,因此+
会将1连接到其值。
您可以在其前面加上+
,以将变量转换为数字:
let str = 'sSAo'
console.log(str[0], str[3]) // all good
for (let i in str) {
// why str[i+1] is undefined ???
console.log(i + 1, +i + 1, str[i], str[+i + 1])
}
答案 3 :(得分:1)
请按以下方式使用parseInt()
:
let str = 'sSAo'
console.log(str[0], str[3]) // all good
for (let i in str) {
// why str[i+1] is undefined ???
console.log(i, str[i], str[parseInt(i)+1])
}
在这种情况下,将仅显示未定义的最后循环时间。希望您是因为它不在str
中。