使用JavaScript for...in循环遍历字符串出现异常结果的原因
字符串用
for...in遍历出现额外属性的问题 问题
我创建了一个字符串变量:
var str = '123a'
为测试使用for...in循环遍历该字符串的效果,我执行了以下代码:
for (chars in str) {console.log(chars)}
但输出结果却包含:
0 1 2 3 d defaultMessage format
请问其中的“d”、defaultMessage、format是什么?为何for...in循环处理字符串会出现这种情况?(注:测试环境为Chrome浏览器控制台)
回答
这是因为for...in循环的核心特性:它会遍历对象所有可枚举的属性,包括从原型链继承来的属性,而不只是字符串自身的索引。
d、defaultMessage、format都是额外添加到String.prototype上的可枚举属性。字符串在JavaScript中属于包装对象,会隐式继承String.prototype的属性,所以for...in会把这些外来属性也纳入遍历范围。这些属性大概率是你之前在控制台运行过的脚本、浏览器插件,或是第三方注入的代码添加的。for...in本来就不是为数组、字符串这类类数组结构设计的,它的目标是遍历普通对象的键。如果只想遍历字符串的字符索引,建议用for循环、for...of循环,或者Array.from(str).forEach()这类方法,它们只会处理字符串自身的索引,不会读取原型链上的额外属性。
举个直观的例子,手动给原型加属性后,就能复现你遇到的情况:
String.prototype.d = '自定义属性'; var str = '123a'; for (chars in str) {console.log(chars);} // 输出会包含0、1、2、3、d
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

