码迷,mamicode.com
首页 > 其他好文 > 详细

ES6中的Iterator和for...of

时间:2017-05-08 12:26:18      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:font   报错   统一   设计   str   next   new   nbsp   原型   

先说说数组遍历的几种方法吧;

1,for循环;  缺点:写法麻烦
2,内置forEach方法;  缺点:不能跳出循环;break和return都不能;
3,for...in;    缺点:数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。某些情况下,for...in循环会以任意顺序遍历键名。总之,for...in循环主要是为遍历对象而设计的,不适用于遍历数组。

4,for...of循环(反正就是各种好)
   有着同for...in一样的简洁语法,但是没有for...in那些缺点。
不同用于forEach方法,它可以与break、continue和return配合使用。
   提供了遍历所有数据结构的统一操作接口。

 

但对象不能被遍历吧,因为没有一种叫Iterator接口(遍历器)的东西;而,数组啊,字符串有啊;;问题来了;我的对象咋办?

重点:对象不能遍历怎么办;解决办法;

 let me= {
              name: ‘liyi‘,
              age: "18",  
              sex: "I am girl"
            };
//            es6[Symbol.iterator] = 
            for (let e in me) {
              console.log(e);  //for...in可以遍历对象的键名
            }
            // name
            // age
            // sex
            
//            for (let e of me) {
//              console.log(e);        // TypeError: meis not iterable;报错了,解决方式有两种
//            }
            //第一种;使用Object.keys方法将对象的键名生成一个数组,然后遍历这个数组。
           for (var key of Object.keys(me)) {
              console.log(key + ‘: ‘ + me[key]);
            }
            
            //第二种;    Generator 函数将对象重新包装一下。
            function* entries(obj) {
              for (let key of Object.keys(obj)) {
                yield [key, obj[key]];
              }
            }
            
            for (let [key, value] of entries(me)) {
              console.log(key, ‘->‘, value);
            }

对已有的默认的数组重新定义遍历接口所遇见的坑;

         var str = new String(‘liyi‘);
//            var str = ‘liyi‘;        
          //坑?不能写成这样子,会在重新定义函数的时候报错,0505-Iterator.html:99 Uncaught TypeError: Cannot create property ‘Symbol(Symbol.iterator)‘ on string ‘liyi‘
              //为啥,可能是因为symbol.iterator本身是构造函数的属性,所以数据也必须是构造出来的,而不是声明的;
//            //还有种可能是,es6在语法上参考了C++和java,在Java中,数组是new String创建数组对象;
            //所以可以这样理解,当要重新定义Symbol.iterator时,会将字符串当作对象,而对象只能被new创建出来,所以当要重新定义遍历器接口时,就需要用new创建的数组,否则会出错;            console.log([...str]);            str[Symbol.iterator] = function(){                return {                    next:function(){                        if(this._first){                            this._first = false;                            return {                                value:‘bye‘,                                done:true                            }                        }else{                            return {                                done:true                            }                        }                    },                    _first:true                }            }            console.log([...str])            console.log(str)

 

ES6中的Iterator和for...of

标签:font   报错   统一   设计   str   next   new   nbsp   原型   

原文地址:http://www.cnblogs.com/liyiyy/p/6824084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!