ES6 - 学习

  • let ,const, var
    var :没有作用域一说,且存在作用域提升的问题
    let const: 只能在当前作用域下,且不能被重复声明. let的变量可以被修改,const的变量不能被修改,

    新的ES6标准中let完全可以替代var

    const使用注意:

    1.错误的书写方式:const修饰的变量是不能被修改的
    const name;
    name = 'zhangsan';
    console.log(name);
    
    2.正确的书写方式
    const name = 'zhangsan';;
    console.log(name);
    
    3.数组或者字典:可以修改内部的值
    const obj = {name:'zhangsan'}; // obj: {name:'zhangsan'}
    obj.name = 'lisi';
    console.log(obj);  // {name: "lisi"}
    
  • 结构赋值
    • 基本使用
      let [name, age, sex] = ['张三', 20, '男'];
      console.log(name);   //张三
      console.log(age);    //20
      console.log(sex);    // 男
      name = '李四';
      console.log(name);   //李四
      
    • 对象的结构赋值
      let {name, age, sex} = {name: '张三', age: 20, sex: '男'};
      console.log(name);   // 张三
      console.log(age);    // 20
      console.log(sex);    // 男
      
    • 数组的结构赋值:只要结构匹配上即可
      简单数组
      let [name, age, sex] = ['张三', 20, '男'];
      console.log(name, age, sex);  // 张三 20 男
      复杂数组
      let [arr1, [arr2, arr3, [arr4, arr5]]] = [1, [2, 3, [4, 5]]];
      console.log(arr1, arr2, arr3, arr4, arr5); // 1  2  3  4  5
      空数组
      let [arr] = [];
      console.log(arr);  // undefined
      特殊情况
      let [a, , , c] = [1, 2, 3];
      console.log(a);  //  1
      console.log(c);  //  undefined
      
    • 基本类型的结构赋值
      字符串本身带有结构器
      let [a, b, c, d, e] = '我是中国人';
      console.log(a);  //  我
      console.log(b);  //  是
      console.log(c);  //  中
      console.log(d);  //  国
      console.log(e);  //  人
      
      Number类型不带有结构器,则会报错,Uncaught TypeError: 12306 is not iterable
      let [a, b, c, d, e] = 12306;
      console.log(a);
      console.log(b);
      console.log(c);
      console.log(d);
      console.log(e);
      
  • 数据集合 (Set)
    特点:

    ①.类似于数组,但没有重复的元素(唯一的);
    ②.开发中用于去除重复数据;
    ③.key和value都是相等的

    1. 创建一个集合
    let set = new Set(['张三', '李四', '王五', '张三', '李四']);
    console.log(set); // {"张三", "李四", "王五"}
    
    2. 一个属性 (size)

    集合长度 : set.size
    比如上面的集合:console.log(set.size); 长度是3

    3. 四个方法
    • add
    set.add('刘德华');
    console.log(set);  // {"张三", "李四", "王五", "刘德华"}
    
    并支持链式调用
    set.add('刘德华').add('周星星');
    console.log(set); // {"张三", "李四", "王五", "刘德华", "周星星"}
    
    • delete
    console.log(set.delete('张三')); // 如果返回true,则删除成功; false,则删除失败
    console.log(set);  // {"李四", "王五"}
    
    • has
    console.log(set.has('张三')); // true
    console.log(set.has('张三2')); // false
    
    • clear
    set.clear();  // 他是没有返回值的,undefined
    console.log(set); // Set(0) {}
    
    • keys() 和 values()
    console.log(set.keys()); // SetIterator {"张三", "李四", "王五"}
    console.log(set.values()); // SetIterator {"张三", "李四", "王五"}
    
  • 数据集合 (Map)

    特点:
    ① - 类似于对象,本质上是键值对集合;
    ② - "键"不局限于字符串,各种类型的值(包括对象,数组)都可以当做键;
    ③ - 对象"字符串 - 值",Map"值 - 值",是一种更加完善的Hash结构实现;

    1. 创建一个Map
    • key值为字符串
      const map = new Map([
         ['name','张三'],
         ['age', 18],
         ['sex','男']
      ]);
      console.log(map); // Map(3) {"name" => "张三", "age" => 18, "sex" => "男"}
      
    • key值也可以是对象或数组
      let obj1 = {a: 1}, obj2 = {b: 2};
      const map = new Map([
          ['name', '张三'],
          ['age', 18],
          ['sex', '男'],
          [obj1, '今天天气不错'],
          [obj2, '适合敲代码'],
          [[1, 2], '哈哈哈']
      ]);
      console.log(map); // Map(6) {"name" => "张三", "age" => 18, "sex" => "男", {…} => "今天天气不错", {…} => "适合敲代码", …}
      
      key值也可以是对象或数组 -- 打印结果
    • 去重 , 当key值是字符串时可以去重,若果是对象或者数组时,不可以去重!
       let obj1 = {a: 1}, obj2 = {b: 2};
       const map = new Map([
         ['name', '张三'],
         ['age', 18],
         ['sex', '男'],
         [obj1, '今天天气不错'],
         [obj2, '适合敲代码'],
         [obj2, '适合敲代码222'],
         [[1, 2], '哈哈哈'],
         [[1, 2], '哈哈哈333333'],
         ['name', '李四'],
         ['age', 22],
         ['sex', '女']
       ]);
       console.log(map);
      
      key值是字符串,去重
    • map的方法


      map的方法
      • set 和 get
        set, 第一个参数是key,第二个参数是value
        map.set('friend', ['赵六', '李七']).set(['dog'], '小花');
        
        get 通过key值去get
        console.log(map.get('name'));  // 张三
        console.log(map.get(obj1));  // 今天天气不错
        
      • delete 通过key删除
        map.delete('name');
        
      • has 是否有某个值,通过key查询
        console.log(map.has('name')); // 存在为true, 不存在为false
        
      • clear 清空
         map.clear(); // 清空
         console.log(map); // Map(0) {}
        
      • keys() , values() , entries()
        map.keys();  // 获取所有的key
        map.values(); // 获取所有的值
        map.entries(); // 获取 key-value
        
      • forEach 遍历
        map.forEach(function (value, index) {
            console.log(index + ':' + value);
        })
        
      forEach 遍历结果
      • map注意事项,添加多个空对象
        map.set({}, '哈哈哈哈哈');
        map.set({}, '呵呵呵呵呵');
        console.log(map);
        console.log({} === {}); // false
        
    map注意事项,添加多个空对象
  • Symbol

应用场景: ES5的对象属性名都是字符串,容易造成属性名称冲突,ES6引入新的原始数据类型Symbol,表示独一无二的值;

对象的属性名可以有两种类型: ①:字符换 ②:Symbol类型:独一无二,不会与其他属性名产生冲突。
定义
    let str1 = Symbol();
    let str2 = Symbol();

    console.log(str1 === str2); / false
    console.log(typeof str1); // symbol
    console.log(typeof str2); // symbol
描述
    let str3 = Symbol('name');
    let str4 = Symbol('name');
    console.log(str3); // Symbol(name)
    console.log(str4); // Symbol(name)
    
    console.log(str3 === str4); // false 不相等
使用
    let obj = {};
    obj.name = '张三';
    obj.name = '李四';
    console.log(obj); // {name: "李四"}

    obj[Symbol('name')] = '张三';
    obj[Symbol('name')] = '李四';
    console.log(obj);
Symbol()使用打印结果
  • class

ES5 时,要实现面向对象是通过构造函数实现的

    function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    Person.prototype = {
        constructor: Person,
        print() {
            console.log('我叫' + this.name + ',今年' + this.age + '岁');
        }
    }
    let person = new Person('张三', 12);
    console.log(person);
    person.print(); // 调用方法

ES6 是通过class来实现面向对象

    class Person {
        constructor(name, age) {
            this.name = name;
            this.age = age;
        }

        // 方法
        print() {
            console.log('我叫' + this.name + ',今年' + this.age + '岁');
        }
    }

    let person = new Person('张三', 12);
    console.log(person);
    person.print();
class的继承

1.创建小球类

    // 小球类
    class Ball{
        /**
         * 构造器
         */
        constructor(x, y, color){
            this.x = x;
            this.y = y;
            this.color = color;
            this.r = 40;
        }

        /**
         * 绘制小球
         */
        render(){
           ctx.save();
           ctx.beginPath();
           ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
           ctx.fillStyle = this.color;
           ctx.fill();
           ctx.restore();
        }
    }

2.创建移动的小球类,并继承自上面的小球类 (extends)

    class MoveBall extends Ball{
        constructor(x, y, color){
            super(x, y, color); // 调用父类的属性,并把参数传递给父类
            /*****儿子自己的属性*****/
            // 量的变化
            this.dX = _.random(-5, 5);
            this.dY = _.random(-5, 5);
            this.dR = _.random(1, 3);
        }
        // 儿子的方法
        upDate(){
            this.x += this.dX;
            this.y += this.dY;
            this.r -= this.dR;
            if(this.r < 0){
                this.r = 0;
            }
        }
    }
  1. 创建MoveBall对象
new MoveBall(e.offsetX, e.offsetY, colorArr[_.random(0, colorArr.length-1)]);

可以参考叶建华老师的绚丽小球代码

  • 随机数
    Math.random(-5, 5); // 产生的是-5到5的随机数(包含边界值)
  • 数组的扩展
    • Array.from 将伪数组或可迭代对象(包括arguments,Array,Map,Set,String...)转换成数组。
       // 获取界面上的所有li标签
       let allLis = document.querySelectorAll('li');
       console.log(allLis); // 是个伪数组
       console.log(Array.isArray(allLis)); //打印下看看是不是数组,结果为: false
      
       // 转化为真的数组
       let  newArray = Array.from(allLis);
       console.log(newArray);
       console.log(Array.isArray(newArray)); // 打印结果为true 是真数组
      
    • Array.of 零零散散的东西转换成数组
      let nums = Array.of(1, 2, 3, 4);
      console.log(nums);
      
      let names = Array.of('张三', '李四', '王五');
      console.log(names);
      
  • 对象的扩展

key和value是一样的,写一个就够了
①.最原始写法

let obj = {
    'name': '张三',
    'age': 18
}

②.外边传值

let name = '张三',
    age = 18;

let obj = {
    'name': name,
    'age': age
}

③.ES6简写法 key和value是一样的,写一个就够了

let name = '张三',
    age = 18;

let obj = {
    name,
    age
}
  • Object.assign() 对象合并
let obj1 = {name: '张三'};
let obj2 = {age: 18};
let obj3 = {sex: '男'};
let obj4 = {friends: '李四'};

let obj = Object.assign({}, obj1, obj2, obj3, obj4);
console.log(obj);
Object.assign() 对象合并
  • ... 展开运算符 (延展运算符)
    • ①. 把字符串拆分放到数组
       let str = '今天天气很好!';
       let strArray = [...str];
       console.log(strArray);
      
      把字符串拆分放到数组
    • ②.数据传递,把对象的数据展开传递
      let student = {
          name: '张三',
          age: 18,
          sex: '男'
      }
      
      // 传递数据的时候,把student中的数据展开传递下去
      <Person {...student}>
      
    • ③.结合Set() 去重
      let myArr = [1, 2, 10, '张三', 20, 2, 1];
      // 使用集合去重
      let set = new Set(myArr);
      // 把集合转成数组,用展开运算符展开
      let arr = [...set];
      console.log(arr);
      
结合Set() 去重 结果
  • 函数设置默认值
    • ES5做法
        // 形参设置默认值
      function sum(num1, num2) {
          num1 = num1 || 10; //默认值10
          num2 = num2 || 10; //默认值10
          console.log(num1 + num2);
      }
    
      sum(10, 20); // 30
      sum(); // 用户传空,调用默认值结果为 20
    
    • ES6做法:简单粗暴
      function sum(num1 = 10, num2 = 10) {
          console.log(num1 + num2);
      }
    
      sum(10, 20); // 30
    
      sum(); // 用户传空,调用默认值结果为 20
    
    • 多种类型参数传递 ...也可用于解构赋值, ...nums代表剩下的内容,注意:...nums不能放在第一个位置!!!
    function sum(name, sex, ...nums) {
    
         console.log(nums); // 打印发现 nums为一个数组
         console.log(name); // 张三
         console.log(sex); // 男
         let result = 0;
         for (let value of nums) {
             result += value;
         }
         return result;
    }
    
    console.log(sum('张三', '男', 10, 20, 30, 50)); // 输出结果为 110
    

    具体参考:http://www.cnblogs.com/mingjiezhang/p/5903026.html

  • 箭头函数
    • 普通函数
     let resulet = function (num1, num2) {
    
          return num1 + num2;
      }
     console.log(resulet(100, 300)); // 400
    
    • 箭头函数
     let resulet = (num1, num2) => {
    
         return num1 + num2;
     }
    
     console.log(resulet(100, 300)); // 400
    
    • 函数中this的指向问题,箭头函数内部会自动绑定
      function demo() {
    
          setTimeout(function () {
              console.log(this); // 打印结果为:Window 指的是窗口
          }, 1000);
    
          // 箭头函数内部会自动绑定
          setTimeout(() => {
              console.log(this); // 打印结果为{},指的下面的obj对象
          }, 1000);
    
      }
    
      let obj = {};
      demo.call(obj);
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 箭头函数(****lambda****表达式)(agr) => { 函数体 }注:只有一个参数可以省略(),函数体...
    神刀阅读 337评论 0 0
  • 《ECMAScript6 入门》阮一峰 读书笔记 let和constlet声明的变量仅在块级作用域内有效,var声...
    亲爱的孟良阅读 716评论 1 2
  • 一 背景 JavaScript经过二十来年年的发展,由最初简单的交互脚本语言,发展到今天的富客户端交互,后端服务器...
    Michael_bdb5阅读 1,237评论 0 2
  • 强大的for-of循环 ES6不会破坏你已经写好的JS代码。目前看来,成千上万的Web网站依赖for-in循环,其...
    Awe阅读 7,511评论 2 7
  • 城南花已开 2015-3-18 生活是一种选择,你可以从中选到你所想要得到的,以及你所想要失去的任何东西。 生命是...
    城南花已开__阅读 296评论 1 1