for…of语句创建的循环可以遍历对象。在ES6中引入的for…of可以替代另外两种循环语句for…in和forEach(),而且这个新的循环语句支持新的迭代协议。
for…of允许你遍历可迭代的数据结构,比如数组、字符串、映射、集合等,循环集合本身的元素。
1.for-in遍历数组的值
var arr = [1,2,3,4,5];
for(let val of arr.values()){
console.log(val)
}
//1
//2
//3
//4
//5
除此之外也可遍历数组的索引 for(let key of arr.keys()){}
2.遍历字符串与类数组
let name = 'Asher';
for (let char of name) {
console.log(char); //A s h e r
}
function sum() {
let sum = 0
for (let num of arguments) {
sum += num
}
console.log(sum); //15
}
sum(1, 2, 3, 4, 5)
## for…in循环它遍历的其实是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性
for in 和for of区别
for…of循环只能和迭代一起工作。但普通对象是不可迭代的
for…in在循环中将遍历对象中所有可枚举属性,包括对象继承自原型对象的属性
题外话:js中什么是可枚举属性
可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for…in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。
- for…in循环
- Object.keys方法
- JSON.stringify方法`在这里插入代码片
var o = {a:1, b:2};
o.c = 3;
Object.defineProperty(o, 'd', {
value: 4,
enumerable: false
});
o.d //可通过此方式直接获取d的值但是在for in中不会取到该属性值
// 4
for( var key in o ) console.log( o[key] );
// 1
// 2
// 3
Object.keys(o) // ["a", "b", "c"]
JSON.stringify(o // => "{a:1,b:2,c:3}"