JS的集合遍历能力(es6新增for-of)


一,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的集合处理能力


能工摹形,巧匠窃意。 -- 毕加索


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容