这段代码甚至有效的JavaScript吗?
for (item in "abc") {
console.log(item);
}
输出:
0
1
2
字符串上的 for/in 循环是什么意思?
如果将字符串视为字符数组,则循环字符串的目的是遍历每个字符。
在 JavaScript 中for..in
循环将返回对象或数组中的键,因此您看到的是数组索引。更有用的格式是:
var str,
item;
str = "abc";
for (item in str) {
console.log(str[item]);
}
这将输出'a'
、'b'
和'c'
。
这段代码甚至有效的JavaScript吗?
现在是,但过去有问题。
请注意,对于较旧的浏览器,字符串不支持数组索引,因此向后兼容的迭代字符串中字符的方式是:
var str,
i;
str = "abc";
for (i = 0; i < str.length; i++) {
console.log(str.charAt(i));
}
是的。
您看到的是字符串中属性的索引/名称。像"abc"[0]
一样索引字符串会导致a
.
您也可以使用属性名称为对象编制索引。
var x = {
foo: "hi"
};
console.log(x["foo"]);
循环只遍历对象的所有成员。
它基本上是一个贯穿每个项目的 foreach 循环。在这种情况下,字符串"abc"看起来只是打印出字符串位置,但这可以与对象一起使用以迭代它们。
for/in
迭代对象的可枚举属性。
因为JS允许你像str[1]
一样使用数组语法读取字符串的字符,所以它会为字符串中的每个索引公开一个数字属性,这就是你的0, 1, 2
输出的来源。 这些是字符串对象的可枚举属性。
这是有效的代码。JavaScript 中的for
in
循环将遍历对象中的键集。对于"abc"
键包括每个字符的索引,以及添加到 String 原型的任何其他属性。
由于for in
找到这些原型属性(特别是如果对象已被修改),通常建议使用一种机制来跳过它们。在这种情况下,您可以使用
if(!"abc".hasOwnProperty(item))continue;
如果要使用此处名为item
的索引,则可以单独访问字符,如下所示
for (item in "abc") {
console.log(item);
//this will log the letters one at a time
console.log("abc"[item]);
}
它记录字符串中字母的索引。
这将输出字母:
string = "abc";
for(var i = 0; i < string.length; i++){
console.log(string[i]);
}
输出:
a
b
c