一,for-of 可遍历的集合
1,数组
2,字符串
3,伪数组(很多类似数组的对象)(需要部署部署数组的Symbol.iterator方法)
let iterable = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
console.log(item); // 'a', 'b', 'c'
}
4,Map 和 Set 对象(ES6中新增的数据结构)
例如:DOM NodeList,函数的参数列表
for-of并不适用于处理原有的原生对象(注意,普通对象部署数组的Symbol.iterator方法,并无效果)
for-of通过方法调用来实现集合的遍历。数组、Maps、Sets 以及其他我们讨论过的对象之间有个共同点:有迭代器方法。
当然,任何对象都可以添加迭代器方法。
就像你可以给任意对象添加myObject.toString()方法,使之可以将对象转换为字符串,你可以将myObject[Symbol.iterator]()方法添加到任意对象,这样对象就可以被遍历了。
这个类似数组的对象默认没有迭代器,调用的数组的迭代器
二,遍历对象的属性 用 for-in 或者 内置的Object.keys()
for-in 专门用来遍历对象的
function fn(){
for(var i in o){
console.log(o[i],i)
}
};fn()
//1 "a" 2 "b"
Object.keys 返回数组的索引 或者对象的key值 或 类数组 对象 的key
var o =[1,2,3]; //0,1,2
var o = {a:1,b:2};//["a", "b"]
Object.keys(o,function(v){
console.log(v)
})
//["a", "b"]
/* getFoo 是个不可枚举的属性 */
var my_obj=Object.create({},
{getFoo:{value:function(){returnthis.foo}}});
my_obj.foo=1;
console.log(Object.keys(my_obj));//["foo"]
三, for 与 forEach (es5)
var arr = [1,2,3];
for(var i=0;i<arr.length;i++){
if(i==1){break;}
if(i==1){continue;}
console.log(arr[i]);
}
在forEach中使用break,continue会报语法错误
arr.forEach(function(v,i){
console.log(v,i)
if(i==1){break;}
})
四,es6的map适用于数组
总结与思考
1,为什么forEach中不能使用break或continue
2,函数式例如ramdajs 内部是如何遍历对象的?用到了of .
其他集合可以用递归,但是,对象貌似不行。
只能用for-in 或者for-of ?
3,为什么 for-in 可以做,还要用for-of 来遍历对象,而且还需要把对象转换为可迭代对象
建议用前端函数式的库,比如underscore,ramda, lodash等,比如ramda中的map可以处理数组或者对象,当然这只是它的基本功能其中的一个API.它的优势特点,之后会有文章发布到简书。
疑问 与 思考:
1> ,for循环语句在使用时,需要定义好遍历的结束条件。
i <data.length
2> for-in专为遍历对象,
var o = {"a":1,"b":2,"c":{"c1":33}};//o.length;//undefined
对象没有length的情况,又不是通过迭代器来实现遍历?那是如果知道是否结束遍历?
3> forEach 与 map 在 ECMAScript 中提供遍历数组的,并且是挂在了数组的原型上。但是在使用时,并没有明确定义遍历结束条件?
map “映射”,也就是原数组被“映射”成对应新数组。
es6中的map与FP中的map的区别?(处理的数据类型更多)
前者 为点语法 data.map();//并且只能处理数组
后者 可以处理数组与对象,伪数组没做测试。
后者语法为 let fn = R.map(fn)(数据集合);//FP的柯里化优势就不多说了
end of JS的集合处理能力
能工摹形,巧匠窃意。 -- 毕加索