美文网首页
JS的集合遍历能力(es6新增for-of)

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

作者: 小牛智慧谷 | 来源:发表于2017-11-23 17:29 被阅读0次

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

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

相关文章

网友评论

      本文标题:JS的集合遍历能力(es6新增for-of)

      本文链接:https://www.haomeiwen.com/subject/ngjzvxtx.html