我正在创建一个循环,一次从一个字符串中获取一个字符,并将其右侧和左侧的部分作为字符串切片.
当使用for .. in时,第二次迭代中的右切片给出''
它应该给出的时间'c'
,尽管i
在所有迭代中都是正确的
var str = 'abc';
for (var i in str)
console.log(i + '/' + str[i] + '/' + str.slice(0, i) + '/' + str.slice(i + 1));
/* output
0/a//bc
1/b/a/
2/c/ab/
*/
// While it works normally with for
for (var i = 0; i < str.length; ++i)
console.log(i + '/' + str[i] + '/' + str.slice(0, i) + '/' + str.slice(i + 1));
/* output
0/a//bc
1/b/a/c
2/c/ab/
*/
为什么会这样?如果...用于字符串时有什么问题?
在for ... in
循环中,值i
将是字符串,而不是数字.属性名称始终为字符串*.
因此,i + 1
意味着11
当i
是"1"
.该.slice()
代码将处理,作为一个数,因为只有3字符串中的字符的结果是一个空字符串.
一般来说,for ... in
除非你真的知道你想要做的是迭代对象及其原型链的所有可枚举属性,否则不是一个好主意.当迭代数组(或类数组对象)的编号属性时,对一系列for
数值的旧式循环更安全,并保证您将按预期顺序迭代.(for ... in
循环不保证迭代的顺序.)还有.forEach()
其他Array.prototype
迭代方法.
*属性名称也可以是现代JavaScript中的Symbol实例,但这显然不是此问题中的问题.