使用 Javascript for..在字符串上的循环得到非常奇怪的结果 [关闭]

Using Javascript For..In loop on Strings gets very strange result [closed]

提问人:Luke 提问时间:9/14/2023 更新时间:9/14/2023 访问量:35

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

2个月前关闭。

我创建了一个字符串变量

var str = '123a'

我想看看如果我使用 for 会发生什么......in 循环循环,所以我跑了

for (chars in str) {console.log(chars)}

但是在输出中,我看到了......

0
1
2
3
d
defaultMessage
format

在这种情况下,“d”是什么?什么是defaultMessage?什么是格式?为什么是为了......以这种方式使用字符串?

旁注: 在 chrome 浏览器控制台内运行

JavaScript 字符串 循环 for 循环

评论

1赞 Dave Newton 9/14/2023
你有没有检查过文档。.在(也许是字符串)中?developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/......
0赞 Luke 9/14/2023
我读到的文档 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ 专门讨论迭代对象
0赞 Luke 9/14/2023
试图获取有关d defaultMessage格式具体来源的信息。这对我来说很奇怪,因为我没有在终端的字符串中添加类似的东西

答:

2赞 Alexander Nenashev 9/14/2023 #1

'为了..in' 运算符迭代对象中的可枚举属性。请注意,原型链中包括可枚举的属性。由于您无法向字符串添加属性,因此似乎有一些代码添加了

d
defaultMessage
format

到 或 .String.prototypeObject.prototype

用于枚举字符。 在对象中查找属性,该属性应引用获取对象的默认迭代器的方法。如果是字符串,其默认迭代器会迭代字符。for..offor..ofSymbol.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)
}