for / for in / for of / forEach

各类迭代循环

for

只能遍历数组,不可遍历一般的对象
可以break continue

for in

可以遍历对象和数组
在遍历对象和数组的时候,会将原型属性,遍历出来。用obj.hasOwnProperty()去判定是否是自身的属性,返回true, 若是原型属性,则返回false
可以break continue

var arr = [1,2,3,4];
Array.prototype.a = “123”
Array.prototype.b = “456”
var obj = {
a:1,
b:2,
c:3,
d:5
}
obj.proto.aaa = “123”
obj.proto.bbb = “456”
for(var index in arr){
if(index == 1){ //当检测到1的时候不打印
continue
}
if(obj.hasOwnProperty(index)){
console.log('index '+ index)
}
}
for(var attr in obj){
console.log('attr ’ + attr)
}

for of

可以遍历 Object Array Set Map
可以break continue
可以直接遍历数组,得到item。
不能直接遍历对象,需要处理,见下面
不会遍历原型中的属性
f### or of 遍历数组

var arr = [“一”,“二”,“三”,“四”];
Array.prototype.a = “五五”
Array.prototype.b = “六六”
、//直接遍历数组,拿出数组的元素
for(var item of arr){
if(item == “四”){
continue //可以break continue
}
console.log('value '+ item)
}
、//获取index
for(var key of arr.keys()){
console.log(key)
}
、//获取item
for(var value of arr.values()){
console.log(value)
}

for of 遍历对象:不可直接遍历,需处理

var obj = {
a: “一”,
b: “二”,
c: “三”,
d: “四”
}
obj.proto.aaa = “五五”
obj.proto.bbb = “六六”、
//直接遍历报错
/*
for(var attr of obj){
console.log('attr ’ + attr)
}
*/
// 用 Object.entries(obj) 去遍历, 类似上面的 keys values属性支持不好 pass掉
for (let [key, value] of Object.entries(obj)) {
if(key == ‘a’){
continue
}
console.log(key, value)
}

for of 遍历Set

var arr = [“add”, “delete”, “clear”, “has”, “has”]
//Set 容器结构无序,不可重复
var list = new Set(arr)
//直接遍历
for (var item of list) {
console.log(item);
}
//因为set没有 key value的区别,所以按key 或者value遍历效果一样
for (var key of list.keys()) {
console.log(key)
}
for (var value of list.values()) {
console.log(value)
}
for (let [key, value] of list.entries()) { //list.entries() 和上面的Object.entries() 效果一样
if (key == “add”) {
continue
}
console.log(key, value)
}

for of 遍历Map

//map是映射
//有key => value 一一对应

let map = new Map()
map.set(“a”, 123).set(“b”, 456).set(“c”, 789)
console.log(map)
//直接遍历
for(var [index, value] of map){
console.log(index, value)
}
console.log("----------------")
for (var key of map.keys()) {
console.log(key)
}
console.log("----------------")
for (var value of map.values()) {
console.log(value)
}
console.log("----------------")
for (let [key, value] of map.entries()) { //map.entries() 和上面的Object.entries()不同 效果一样
if (key == “a”) {
continue
}
console.log(key, value)
}

forEach : 不可遍历对象

可以遍历Array Set Map 不可遍历对象
不可以break continue

//forEach遍历数组
var arr = [“一”, “二”, “三”, “四”];
Array.prototype.a = “五五”
Array.prototype.b = “六六”
arr.forEach(function(item, index ,arr){
console.log(index, item, arr)
})
console.log("-----------------")

//forEach遍历Set

var arr1 = [“add”, “delete”, “clear”, “has”, “has”]
var list = new Set(arr1)
list.forEach(function(item, index ,arr){
console.log(index, item, arr)
})
console.log("-----------------")

//forEach遍历Map

let map = new Map()
map.set(“a”, 123).set(“b”, 456).set(“c”, 789)
map.forEach(function(item, index ,arr){
console.log(index, item, arr)
})

附:object对象keys(), values() entries()
参考文章:http://blog.sina.com.cn/s/blog_c112a2980102xqg9.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值