JavaScript ES6新特性学习

JavaScript ES6新特性

文章目录


JavaScript ES6新特性学习

ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript之前的版本里并没有的概念

## 1. 函数参数默认值
// ES6 允许给函数参数赋值初始值
      // 1.形参初始值 具有默认值的参数,一般位置要靠后
      function add(a, b, c = 10) {
        return a + b + c;
      }
      let result = add(1, 2, 3);
      console.log(result); //6

      let result1 = add(1, 2);
      console.log(result1); //13

      //2.与解构赋值结合
      function connect(options) {
        let host = options.host;
        let username = options.username;
        //等等
      }

      connect({
        host: "localhost",
        username: "root",
        password: "root",
        port: 3306,
      });

      function connect({ host, username, password, port = 3306 }) {
        console.log(host); //localhost
        console.log(username); //root
        console.log(password); //root
        console.log(port); //3306
      }

      connect({
        host: "localhost",
        username: "root",
        password: "root",
        // port: 3306
      });

2. 简化对象写法

//ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法
//书写更简洁,程序员可以更加偷懒了!!!
let name = "奉先";
let change = function () {
    console.log("我们可以改变你!!!");
};

const SCHOOL = {
    name,
    change,
    improve() {
        console.log("方法也更加简洁了,之前的是improve:function(){}");
    },
};
change();
SCHOOL.improve();
console.log(SCHOOL);

3. 箭头函数(Lambda表达式)

      //箭头函数声明与我们之前函数声明的区别

      //1.this 是静态的,this始终指向函数声明时所在作用域下的this的值
      function getName() {
        console.log(this.name);
      }

      let getName2 = () => {
        console.log(this.name);
      };

      window.name = "奉先";
      const SCHOOL = {
        name: "yuanchen",
      };

      // //直接调用
      getName(); //奉先
      getName2(); //奉先

      // //call 方法调用(可以改变函数内部this的值)
      getName.call(SCHOOL); //yuanchen     method.invoke(  o )   o.method();
      getName2.call(SCHOOL); //奉先  并没有改变, this 是静态的,this始终指向函数声明时所在作用域下的this的值

      //2.不能作为构造实例化对象
      let Person = function (name, age) {
        this.name = name;
        this.age = age;
      };
      let me = new Person("xxn", "19");
      console.log(me);

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

      let me = new Person("xxn", "19"); //Person is not a constructor   原因this
      console.log(me);

      //3.不能使用arguments变量
      let fn = function () {
        console.log(arguments);
      };
      fn(1, 2, 3);

      let fn = () => {
        console.log(arguments); //arguments is not defined  arguments  (因为函数也是一种特殊对象,由容器创建,所以事先放入了一些属性)(index5.html)
      };
      fn(1, 2, 3);

      //4.箭头函数的简写
      //1)省略小括号,当形参有且只有一个的时候
      let add = (n) => {
        return n + n;
      };

      // let result=add(9);
      // console.log(result);  //18

      // //2)省略花括号,当代码体只有一条语句的时候,此时return也必须省略
      // 语句的执行结果就是函数的返回值
      let pow = (n) => n * n;
      console.log(pow(9)); //81   此处不是很清楚的建议去看康师傅的javase,后面会讲到lambda表达式

4. 解构赋值

      //ES6 解构赋值--------------->允许按照一定模式从数组和对象中提取值,对变量进行赋值
      //1.数组的解构
      const F4 = ["小沈阳", "刘能", "赵四", "宋小宝"];
      let [xiao, liu, zhao, song] = F4;
      console.log(xiao); //小沈阳
      console.log(liu); //刘能
      console.log(zhao); //赵四
      console.log(song); //宋小宝

      //2.对象的解构
      const zhao = {
        name: "赵本山",
        age: "20",
        xiaopin: function () {
          console.log("我可以演小品");
        },
      };

      let { name, age, xiaopin } = zhao; //注意此处是{},不是[],区别于数组
      console.log(name);
      zhao.name = "赵四";
      console.log(name);
      console.log(age);
      console.log(xiaopin);
      xiaopin();

      //用于某属性或方法频繁调用,例如:
      //当我们频繁调用xiaopin方法时;
      zhao.xiaopin();
      zhao.xiaopin();
      zhao.xiaopin();
      zhao.xiaopin(); //zhao这也算重复,这时可以用到解构赋值
      let { xiaopin } = zhao;
      xiaopin();
      xiaopin();
      xiaopin();
      xiaopin();

5. 拓展运算符 …

      //  ... 扩展运算符能将数组转换为逗号分隔的参数序列
      //声明一个数组
      const tfboys = ["易烊千玺", "王源", "王俊凯"];
      //声明一个函数
      function chunwan() {
        console.log(arguments);
      }
      let app = {
        url: "miniProgram/sendCode",
        method: "POST",
        data: {
          phone: 17670459756,
        },
      };
      chunwan(tfboys); //0: (3) ["易烊千玺", "王源", "王俊凯"],length=1
      chunwan(...tfboys); //chunwan('易烊千玺','王源','王俊凯'),变成了三个参数,  length: 3

      //1.数组的合并
      const KUAIZI = ["肖央", "王太利"];
      const FH = ["曾毅", "玲花"];
      //const zuixuanxiaopingguo=KUAIZI.concat(FH);
      const zuixuanxiaopingguo = [...KUAIZI, ...FH]; //["肖央", "王太利", "曾毅", "玲花"]
      console.log(zuixuanxiaopingguo);

      //2.数组的克隆
      const SZH = ["E", "G", "M"];
      const SYC = [...SZH]; //['E','G','M'];
      console.log(SYC); //浅拷贝

      //3.将伪数组转换为真正的数组
      const DIVS = document.querySelectorAll("div");
      console.log(DIVS); //Object
      const DIVSARR = [...DIVS];
      console.log(DIVSARR); //Array

6.模板字符串

      var a = 1;
      var b = 2;
      var sum = a + b;
      var res = `a+b的和是${sum}`;
      console.log(res);//a+b的和是3

      // =======================================

      var obj = { name: "张三;", age: 18 };
      var str = `姓名:${obj.name}年龄:${obj.age}`;
      console.log(str);//姓名张三,年龄18

      //3.变量拼接
      let lovest = "`魏翔`";
      let out = lovest + "是我心目中最搞笑的演员"; //之前的拼接

      //使用``之后
      let lovest2 = `魏翔`;
      let out2 = `${lovest2}是我心目中最搞笑的演员`;
      console.log(out2); //魏翔是我心目中最搞笑的演员

7. forof遍历数组

    //我们之前遍历  for in
    for (let x in arr) {
      console.log(x); //此时的x是下标,若想取到值则需看下一行代码
      console.log(typeof x);//string,注意forin遍历的index是string类型的
      console.log(arr[x]);
    }

	//可以使用forEach来获得number类型的index
    arr.forEach((value, index) => {
      console.log(value);//数组中的值
      console.log(index);//number类型的索引
      console.log(typeof index);//number
    });	

    //使用for of
    for (let x of arr) {
      console.log(x); //唐僧  孙悟空 猪八戒 沙僧   ,取到的是值
    }

8. promise&generator

8.1 all

all的主要作用是等到 [] 括号里的所有promise请求都请求完成后才执行回调函数,常用来在页面刚加载时确保数据全部能刷新出来

<!DOCTYPE html>
<html>
  <head>
    <title>all</title>
  </head>

  <body></body>

  <script>
    var promise1 = new Promise(function (resolve) {
      setTimeout(function () {
        resolve(1);
        alert(1 + "先到");
      }, 3000);
    });
    var promise2 = new Promise(function (resolve) {
      setTimeout(function () {
        resolve(2);
        alert(2 + "先到");
      }, 1000);
    });
    Promise.all([promise1, promise2]).then(function (value) {
      alert(value);
    });
  </script>
</html>

8.2 race

race和all恰恰相反,当 [ ] 括号里的任意promise请求完成后就会执行回调函数里的内容

<!DOCTYPE html>
<html>
  <head>
    <title>异步</title>
  </head>

  <body></body>

  <script>
    function timerPromise(delay) {
      return new Promise(function (resolve) {
        //console.log(delay);
        resolve(delay);
      });
    }
    // 任何一个promise变为resolve或reject 的话程序就停止运行
    Promise.race([
      timerPromise(1),
      timerPromise(32),
      timerPromise(64),
      timerPromise(128),
    ]).then(function (value) {
      console.log(value); // => 1
    });

    function getURL(URL) {
        return new Promise(function (resolve, reject) {
            var req = new XMLHttpRequest();
            req.open('GET', URL, true);
            req.onload = function () {
                if (req.status === 200) {
                    resolve(req.responseText);
                } else {
                    reject(new Error(req.statusText));
                }
            };
            req.onerror = function () {
                reject(new Error(req.statusText));
            };
            req.send();
        });
    }
    var URL = "...";
    getURL(URL).then(function onFulfilled(value) {
        console.log(value);
    });
  </script>
</html>

上一篇:es6的块级作用域


下一篇:es6 新增的两种数据结构 Set Map