高阳的技术专栏 gy

es6语法总结

2019-03-29
gaoyang

阅读:

js

es6语法总结

let关键字

  1. 作用:

    与var类似, 用于声明一个变量

  2. 特点:

在块作用域内有效

不能重复声明

不会预处理, 不存在提升

  1. 应用:

    循环遍历加监听

    使用let取代var是趋势

    var btns = document.getElementsByTagName('button');

     for (let i = 0; i < btns.length; i++) {
       debugger
       btns[i].onclick = function () {
         alert(i);
       }
     }

const关键字

  1. 作用:

    定义一个常量

  2. 特点:

    不能修改

    其它特点同let

  3. 应用:

    保存不用改变的数据

变量的解构赋值

  1. 理解: 从对象或数组中提取数据, 并赋值给变量(多个)
  2. 对象的解构赋值 let {n, a} = {n:’tom’, a:12}
  3. 数组的解构赋值 let [a,b] = [1, ‘atguigu’];
  4. 用途 给多个形参赋值
 <script type="text/javascript">
   let person = {
     name: '吴杰',
     age: 20
   }
   // let name = person.name;
   // let age = person.age;

   // console.log(name, age);  name is not defined
   let {name, age} = person;  //解构赋值拆解等号右边的对象,将对象中指定属性的值赋值给等号左边的变量
                           //如果找不到此属性,返回undefined
   console.log(name);
   console.log(age);

   let arr = [1, 2, 3];
   let [a, b, c, d] = arr;
   console.log(a, b, c, d);
 </script>

模板字符串

  1. 模板字符串 : 简化字符串的拼接

    模板字符串必须用 `` 包含

    变化的部分使用${xxx}定义

 <script type="text/javascript">
   var obj = {
     name: '吴杰',
     age: 18,
     info: 'xxxx""'
   }
   console.log('名字:' + obj.name);
   console.log(`名字:${obj.name}  年龄:${obj.age} 'sdsads'`);

 </script>

简化的对象写法

 <script type="text/javascript">
   let a = 123;
   let b = 456;
   /*let obj = {
     a: a,
     b: b,
     setA: function (x) {
       this.a = x;
     }
   }*/
   let obj = {
     a,   //省略同名的变量
     b,
     setA (x) {  //省略function关键字
       this.a = x;
     }
   }
   console.log(obj);
 </script>

箭头函数

箭头函数的特点:

1、简洁

2、箭头函数没有自己的this,箭头函数的this不是调用的时候决定的,而是在定义的时候处在的对象就是它的this

3、扩展理解: 箭头函数的this看外层的是否有函数,

    如果有,外层函数的this就是内部箭头函数的this,

    如果没有,则this是window。
 <script type="text/javascript">
   /*
     创建函数的方式:
       函数表达式
       函数声明
    */
   /*function fn1() {  //函数声明

   }
   let fn2 = function () {  //函数表达式

   }*/
   let fn3 = () => {  //为了省略function

   }
   //没有传参,并且语句只有一条
   let fn4 = () => console.log('hello');
   console.log(fn4());
   //有一个参数,并且语句只有一条
   let fn5 = x => x;
   console.log(fn5(123));
   /*//两个参数和两个以上,并且语句只有一条
   let fn6 = (x, y) => console.log(x, y);
   fn6(123, 456);
   //多条语句
   let fn7 = (x, y) => {
     let result = x + y;
     console.log(result);
   }
   fn7(123, 456);

   let fn8 = () => console.log(this);  //window
   fn8();
   /!*
     箭头函数的this看外层的是否有函数,
         如果有,外层函数的this就是内部箭头函数的this,
         如果没有,则this是window。
    *!/
   let obj = {};
   function foo1() {
     let fn9 = () => console.log(this);  //window
     fn9();
   }
   foo1();

   function foo2() {
     let fn9 = () => console.log(this);  //obj
     fn9();
   }
   foo2.call(obj);
   /!*
     箭头函数是静态的,和它在哪定义有关,和它在哪调用没有关系
    *!/
   let fn10 = () => console.log(this); //window
   function foo3() {
     fn10();
   }
   foo3.call(obj);

   let fn11 = () => {
     console.log(this);  //window
     let fn12 = function () {
       console.log(this);  //obj
       let fn13 = () => {
         console.log(this);  //obj
         let fn14 = () => {
           console.log(this);  //obj
         }
         fn14();
       }
         fn13.call(window)
     }
     fn12.call(obj);
   }
   fn11()

   let obj1 = {
     sayName (name) {
       let fn = () => {
         console.log(this);  //obj1
         console.log(name);
       }
       fn();
     }
   }
   obj1.sayName('bob');*/

   /*var flag = true
   /!*if (flag) {
     console.log(flag);
   }*!/
   if (!flag) console.log(flag);
   else if (flag) console.log(flag);*/
 </script>

3点运算符

用途

  1. rest(可变)参数

    • 用来取代arguments 但比 arguments 灵活,只能是最后部分形参参数
       function fun(...values) {
        console.log(arguments);
        arguments.forEach(function (item, index) {
            console.log(item, index);
        });
        console.log(values);
        values.forEach(function (item, index) {
            console.log(item, index);
        })
       }
       fun(1,2,3);
      
  2. 扩展运算符

  let arr1 = [1,3,5];
  let arr2 = [2,...arr1,6];
  arr2.push(...arr1);
  <script type="text/javascript">

    function fn(...args) {
      // console.log(a, b, c);
      // console.log(arguments);
      // console.log(arguments.callee);
      /*let args = []
      for (var i = 0; i < arguments.length; i++) {
        args.push(arguments[i]);
      }*/
      console.log(...args);
      args.forEach(function (item) {
        console.log(item);
      })
    }
    fn(1, 2, 3, 4, 5);

    let arr1 = [1, 2, 3];
    let arr2 = [4, ...arr1, 5];
    console.log(arr2);

  </script>

形参默认值

形参的默认值—-当不传入参数的时候默认使用形参里的默认值

 <script type="text/javascript">
   function Point(x = 1,y = 2) {
     this.x = x;
     this.y = y;
   }
   let p = new Point(3, 4);
   console.log(p);

   let fn = (x = 1, y = 2) => x + y;
   console.log(fn());  //3
 </script>

Promise对象

  1. 理解: Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)

    有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称’回调地狱’)

    ES6的Promise是一个构造函数, 用来生成promise实例

  <script type="text/javascript">
     const title = document.getElementById('title');
     const content = document.getElementById('content');
     const list = document.getElementById('list');

     function getNews(url) {
       const promise = new Promise((resolve, reject) => {
         const xhr = new XMLHttpRequest();
         xhr.open('GET', url);
         xhr.send();
         xhr.onreadystatechange = function () {
             if (xhr.readyState === 4) {
                 if (xhr.status === 200) {
                     //请求成功并返回数据
                     let data = xhr.responseText;
                     data = JSON.parse(data);
                     console.log(data);
                     resolve(data);
                 } else {
                     //请求失败
                     reject('error');
                 }
             }
         }
     })
       return promise;
     }

     getNews('http://localhost:3000/news?id=1')
       .then((result) => {
         console.log(result);
         //获取到数据,显示新闻内容
         title.innerText = result.title;
         content.innerText = result.content;
         //发送请求,请求评论内容
         const url = `http://localhost:3000${result.commentsUrl}`;
         return getNews(url);
       }, (error) => {
         console.log(error);
       })
       //链式调用
       .then((result) => {
         //显示评论信息
         let html = '';
         result.forEach(item => html += '<li>' + item.content + '</li>');
         setTimeout(function () {
           list.innerHTML = html;
         }, 2000)
       }, (error) => {
         console.log(error);
       })

   </script>

Symbol

前言:ES5中对象的属性名都是字符串,容易造成重名,污染环境

Symbol:

  概念:ES6中的添加了一种原始数据类型symbol(已有的原始数据类型:String, Number, boolean, null, undefined, 对象)

  特点:

    1、Symbol属性对应的值是唯一的,解决命名冲突问题

    2、Symbol值不能与其他数据进行计算,包括同字符串拼串

    3、for in, for of遍历时不会遍历symbol属性。

  使用:

    1、调用Symbol函数得到symbol值
          let symbol = Symbol();
          let obj = {};
          obj[symbol] = 'hello';
    2、传参标识
          let symbol = Symbol('one');
          let symbol2 = Symbol('two');
          console.log(symbol);// Symbol('one')
          console.log(symbol2);// Symbol('two')
    3、内置Symbol值
          * 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
          - Symbol.iterator
           * 对象的Symbol.iterator属性,指向该对象的默认遍历器方法(后边讲)
 <script type="text/javascript">
     window.onload = function () {
       let symbol = Symbol();
       console.log(typeof symbol);
       console.log(symbol);

       // 用作对象的属性(唯一)
       let obj = {username: 'kobe', age: 39};
       obj[symbol] = 'hello';
       obj[symbol] = 'symbol';
       console.log(obj);
       for(let i in obj){
         console.log(obj[i]);
       }
     }
 </script>

async函数

async函数(源自ES2017)

概念: 真正意义上去解决异步回调的问题,同步流程表达异步操作

本质: Generator的语法糖

语法:
        async function foo(){
          await 异步操作;
          await 异步操作;
特点:

  1、不需要像Generator去调用next方法,遇到await等待,当前的异步操作完成就往下执行

  2、返回的总是Promise对象,可以用then方法进行下一步操作

  3、async取代Generator函数的星号*,await取代Generator的yield

  4、语意上更为明确,使用简单,经临床验证,暂时没有任何副作用
 async function sendXml(url) {
      return new Promise((resolve, reject) => {
        $.ajax({
          url,
          type: 'GET',
          success: data =>  resolve(data),
          error: error => reject(error)
        })
      })
    }

class

  1. 通过class定义类/实现类的继承

  2. 在类中通过constructor定义构造方法

  3. 通过new来创建类的实例

  4. 通过extends来实现类的继承

  5. 通过super调用父类的构造方法

  6. 重写从父类中继承的一般方法

  <script type="text/javascript">
      class Person {
          //调用类的构造方法
          constructor(name, age){
              this.name = name;
              this.age = age;

          }
          //定义一般的方法
          showName(){
              console.log(this.name, this.age);
          }
      }
      let person = new Person('kobe', 39);
      console.log(person, person.showName());

      //定义一个子类
      class StrPerson extends Person{
          constructor(name, age, salary){
              super(name, age);//调用父类的构造方法
              this.salary = salary;
          }
          showName(){//在子类自身定义方法
              console.log(this.name, this.age, this.salary);
          }
      }
      let str = new StrPerson('weide', 38, 1000000000);
      console.log(str);
      str.showName();
  </script>

Similar Posts

Comments