提问人:Luke 提问时间:9/14/2023 更新时间:9/14/2023 访问量:35
使用 Javascript for..在字符串上的循环得到非常奇怪的结果 [关闭]
Using Javascript For..In loop on Strings gets very strange result [closed]
问:
我创建了一个字符串变量
var str = '123a'
我想看看如果我使用 for 会发生什么......in 循环循环,所以我跑了
for (chars in str) {console.log(chars)}
但是在输出中,我看到了......
0
1
2
3
d
defaultMessage
format
在这种情况下,“d”是什么?什么是defaultMessage?什么是格式?为什么是为了......以这种方式使用字符串?
旁注: 在 chrome 浏览器控制台内运行
答:
2赞
Alexander Nenashev
9/14/2023
#1
'为了..in' 运算符迭代对象中的可枚举属性。请注意,原型链中包括可枚举的属性。由于您无法向字符串添加属性,因此似乎有一些代码添加了
d
defaultMessage
format
到 或 .String.prototype
Object.prototype
用于枚举字符。 在对象中查找属性,该属性应引用获取对象的默认迭代器的方法。如果是字符串,其默认迭代器会迭代字符。for..of
for..of
Symbol.iterator
const str = '1234';
str.dummy = 'DUMMY';
String.prototype.d = 'd';
String.prototype.defaultMessage = 'message';
String.prototype.format = 'format';
for (const char in str) {
console.log(char)
}
console.log('str enumerable own props:', ...Object.values(Object.getOwnPropertyDescriptors(str)).filter(prop => prop.enumerable).map(JSON.stringify));
console.log('String.prototype enumerable own props:', ...Object.values(Object.getOwnPropertyDescriptors(String.prototype)).filter(prop => prop.enumerable).map(JSON.stringify));
console.log('iterating default iterator implicitly');
for (const char of str) {
console.log(char)
}
console.log('getting default iterator explicitly');
for (const char of str[Symbol.iterator]()) {
console.log(char)
}
评论