ES6(ECMA2015)、let、const、变量解构赋值、模板字符串

一、let 关键字

1. 作用:
  * 与var类似, 用于声明一个变量
2. 特点:
  * 在块作用域内有效
  * 不能重复声明
  * 不会预处理, 不存在变量提升
3. 应用:
  * 循环遍历加监听
  * 使用let取代var是趋势
<script type="text/javascript">

  {
    var a=10;
    let b=20; //在块作用域内有效
    console.log(b)// 20
  }
  console.log(a);//10
  console.log(b);// b is not defined ;在全局内看不到在块作用域内用let关键字定义的变量
</script>
<script type="text/javascript">    
    let age = 12;
    let age = 13;//不能重复声明
</script>
  console.log(age);// age is not defined 报错
    let age = 12;
    console.log(sex);//undefined
    var sex="男"

应用 :(此http://es6.ruanyifeng.com/网站对应用的解释很不错)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01_let关键字</title>
</head>
<body>

<button>测试1</button>
<br>
<button>测试2</button>
<br>
<button>测试3</button>
<br>

<script type="text/javascript">

    console.log(age);
    let btns = document.getElementsByTagName('button');
    for(let i = 0;i<btns.length;i++){
            btns[i].onclick = function () {
                alert(i);// 0 1 2 
            }
    }

</script>
</body>

二、const 关键字

1. 作用:
  * 定义一个常量
2. 特点:
  * 不能修改
  * 其它特点同let
3. 应用:
  * 保存不用改变的数据
    const sex = '男';
    console.log(sex);
    sex = '女';//直接保存 不能修改
    console.log(sex);

三、数组、对象的解构赋值

1. 理解:
  * 从对象或数组中提取数据, 并赋值给变量(多个)
2. 对象的解构赋值
  let {n, a} = {n:'tom', a:12}
3. 数组的解构赋值
  let [a,b] = [1, '李不烦'];
4. 用途
  * 给多个形参赋值

四、模板字符串

1. 模板字符串 : 简化字符串的拼接
  * 模板字符串必须用 `` 包含
  * 变化的部分使用${xxx}定义
<script type="text/javascript">
    let obj = {
        name : 'anverson',
        age : 41
    };
    console.log('我叫:' + obj.name + ', 我的年龄是:' + obj.age);

    console.log(`我叫:${obj.name}, 我的年龄是:${obj.age}`);
</script>

五 、简化对象

        let x=3
        let y=5

// es5写法
        let point={
            x:x,
            y:y,
            getPoint:function () {
                return this.x
            }
        }
        console.log(point,point.x)//{x: 3, y: 5, getPoint: ƒ} 3

// es6 
        let p={
            x,// 属性和属性值都用x表示,x在全局中被定义,若没定义,报错:x is not defined
            y,
            getPoint(){
//方法不用function关键字
                return x
            }
        }
        console.log(p,p.x)//{x: 3, y: 5, getPoint: ƒ} 3

六、箭头函数

* 作用: 定义匿名函数
* 基本语法:
  * 没有参数: () => console.log('xxxx')
  * 一个参数: i => i+2
  * 大于一个参数: (i,j) => i+j
  * 函数体不用大括号: 默认返回结果
  * 函数体如果有多个语句, 需要用{}包围,若有需要返回的内容,需要手动返回
* 使用场景: 多用来定义回调函数

* 箭头函数的特点:
    1、简洁
    2、箭头函数没有自己的this,箭头函数的this不是调用的时候决定的,而是在定义的时候处在的对象就是它的this
   3、扩展理解: 箭头函数的this看外层的是否有函数,
        如果有,外层函数的this就是内部箭头函数的this,
        如果没有,则this是window。
     function fn() {
            console.log("我是fn 输出")
        }
        fn()//我是fn 输出

        // 函数没有形参,且方法体只有一条语句
        let fn2=()=>console.log("我是fn2 输出")
        fn2() //我是fn2 输出

        // 函数有一个形参,且方法体只有一条语句
        let fn3=(a)=>console.log(a)
        fn3(6)//6
        let fn33=a=>console.log(a)//只有一个形参,括号可以省略
        fn33(6)//6

        //一个以上形参
        let fn4=(a,b)=>a+b
        console.log(fn4(5, 5));//10 ;只有一句函数体 默认返回

        // 一个以上形参,函数体有多条语句
        let fn5=(a,b)=>{
            let i=10
            return a+b+i //函数体有多条语句,需要手动返回
        }
        console.log(fn5(3, 5));//18
    setTimeout(()=> {
        console.log(this)//window 对象
    },1000)

    let per={
        age:18,
        method:function () {
            setTimeout(()=> {
                console.log(this)// per对象 ;箭头函数没有this,向上找,在method作用域中,谁调用this就是谁,per调用method()方法,所以method作用域中的this就是per对象,从而箭头函数的this也是per对象
                this.sex="男"
            },1000)
        }
    }

    per.method()

 

七、点点点(...)运算符

用途
1. rest(可变)参数
    * 用来取代arguments 但比arguments灵活,只能是最后部分形参参数
  function add(...values) {
    let sum = 0;
    for(value of values) {
      sum += value;
    }
    return sum;
  }
2. 运算符
  let arr1 = [1,3,5];
  let arr2 = [2,...arr1,6];
  arr2.push(...arr1);
 function fn(...values) {
            console.log(values instanceof Array)//true
            let val=0;
            values.forEach(function (item) {
                val+=item
            })
            return val
        }

        console.log(fn(1, 2, 3));//6
 function fn(a,...values) {
            console.log(values instanceof Array)//true
            let val=0;
            values.forEach(function (item) {
                val+=item
            })
            return val
        }

        console.log(fn(1, 2, 3));//5
       let arr=[3, 4, 5]
       let arr2=[1, 2,...arr, 6]

        console.log(arr2)//(6) [1, 2, 3, 4, 5, 6]
    let arr=[3, 4, 5]
       let arr2=[1, 2, 6]
        arr2.push(arr)
        console.log(arr2)//(4) [1, 2, 6, Array(3)];数组长度4,索引下标3 对应的值是数组arr

八、默认形参

形参的默认值----当不传入参数的时候默认使用形参里的默认值
    function Point(x = 1,y = 2) {
    this.x = x;
    this.y = y;
    }
    function point(x,y) {
            this.x=x,
            this.y=y
        }
        let p=new point()
        console.log(p);//point {x: undefined, y: undefined}


        function point2(x=0,y=0) {
            this.x=x,
            this.y=y
        }
        let p2=new point2()
        console.log(p2);//point2 {x: 0, y: 0}

九、Promise对象

1. 理解:
  * Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)
  * 有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱')
  * ES6的Promise是一个构造函数, 用来生成promise实例
2. 使用promise基本步骤(2步):
  * 创建promise对象
    let promise = new Promise((resolve, reject) => {
        //初始化promise状态为 pending
      //执行异步操作
      if(异步操作成功) {
        resolve(value);//修改promise的状态为fullfilled
      } else {
        reject(errMsg);//修改promise的状态为rejected
      }
    })
  * 调用promise的then()
    promise.then(function(
      result => console.log(result),
      errorMsg => alert(errorMsg)
    ))
3. promise对象的3个状态
  * pending: 初始化状态
  * fullfilled: 成功状态
  * rejected: 失败状态
4. 应用:
  * 使用promise实现超时处理

  * 使用promise封装处理ajax请求
    let request = new XMLHttpRequest();
    request.onreadystatechange = function () {
    }
    request.responseType = 'json';
    request.open("GET", url);
    request.send();
  // 创建promise 对象,执行参数函数   初始化状态为pending  内部启动异步任务
    // 执行then    指定一个成功的回调函数  和 一个失败的回调函数
    // 一会内部异步任务执行完毕  可能成功  调用 resolve ---> 修改状态 fullfiilled  可能失败  调用reject ----> 修改状态rejected
   // 如果执行resolve 成功回调函数自动调用
   // 如果执行reject  失败回调函数自动调用
<script type="text/javascript">

    //创建一个promise实例对象
    let promise = new Promise((resolve, reject) => {
        //初始化promise的状态为pending---->初始化状态
        console.log('1111');//同步执行
        //启动异步任务
        setTimeout(function () {
            console.log('3333');
            //resolve('baidu.com');//修改promise的状态pending---->fullfilled(成功状态)
            reject('xxxx');//修改promise的状态pending----->rejected(失败状态)
        },1000)
    });
    promise.then((data) => {
        console.log('成功了。。。' + data);
    }, (error) => {
        console.log('失败了' + error);
    });
    console.log('2222');


    //定义一个请求news的方法
    function getNews(url) {
        //创建一个promise对象
        let promise = new Promise((resolve, reject) => {
            //初始化promise状态为pending
            //启动异步任务
            let request = new XMLHttpRequest();
            request.onreadystatechange = function () {

                if(request.readyState === 4){
                    if(request.status === 200){
                        let news = request.response;
                        resolve(news);
                    }else{
                        reject('请求失败了。。。');
                    }
                }
            };
            request.responseType = 'json';//设置返回的数据类型
            request.open("GET", url);//规定请求的方法,创建链接
            request.send();//发送
        })
        return promise;
    }

    getNews('http://localhost:3000/news?id=2')
            .then((news) => {
                console.log(news);
                document.write(JSON.stringify(news));
                console.log('http://localhost:3000' + news.commentsUrl);
                return getNews('http://localhost:3000' + news.commentsUrl);
            }, (error) => {
                alert(error);
            })
            .then((comments) => {
                console.log(comments);
                document.write('<br><br><br><br><br>' + JSON.stringify(comments));
            }, (error) => {
                alert(error);
            })
</script>

十、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() //kobe 39

    //定义一个子类
    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);//StrPerson
    str.showName();//weide 38 1000000000
</script>

 

 

学习es6的一个网址:http://es6.ruanyifeng.com/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值