ES6中let const命令详解及区别

ES6中let const命令详解及区别

一. let命令

  1. let命令用于声明变量,其用法与var类似,但是所声明的变量只在let命令所在的代码块内有效
        {
            let a = 1;
            var b = 0
        }
        console.log(a); //因为在a所在的块级作用域之外访问,所以会抛出错误
  1. let不存在变量提升,而var存在变量提升
        console.log(temp); //undefined
        var temp = 10;//var存在变量提升,所以不会抛出错误
        console.log(temp1); //Error,因为let不存在变量提升,所以要先定义,再使用
        let temp1 = 10;
  1. 暂时性死区(TDZ):只要块级作用域内存在let命令,它所声明的变量就"绑定"这个区域,不再受外部的影响,简而言之:在代码块内,使用let声明变量之前,该变量都是不可用的
		var temp2 = 123;
        if (true) {
            temp2 = 'abc';
            let temp2;
        }
        console.log(temp2);//因为在声明temp2之前就使用了temp2,根据let的暂时性死区,会抛出错误

暂时性死区也意味着typeof不再是一个百分百安全的操作

		typeof(x); //Error
        let x;//因为暂时性死区而没有检测到x的值,所以会抛出错误

作为比较,若一个变量没有被声明,使用typeof不会发生错误,而是会返回undefined,所有在没有let之前,使用typeof绝对不会出错

        console.log(typeof(y)); //undefined
  1. let不允许在相同作用域内重复声明同一个变量
        function fn1() {
            let a = 10;
            var a = 11;
        }
        fn1();//Error
        function fn2(){
            let a=10;
            let a=11;
        } 
        fn2();//Error

二. const命令

  1. const声明一个只读的变量,一旦声明,常量的值就不能改变
        const PI = 3.14;
        console.log(PI);
        PI = 3.1415926;//Error,因为已经给PI赋值成3.14,所以不允许再对PI进行改动

这也意味着,const一旦声明常量,就必须立即初始化,不能留到以后赋值,也就是说,只声明不赋值会发生错误

const foo;//Error,因为没有给foo赋值
  1. const作用域与let相同,只在声明所在的块级作用域内有效(const与let的相同点)
        if (true) {
            const MAX = 99;
        }
        console.log(MAX);//Error,在块级作用域之外访问MAX会抛出错误
  1. const声明的变量也不会提升,同样存在暂时性死区,只能在声明后使用(const与let的相同点)
    参照上述let代码
  2. const与let一样,不可重复声明(const与let的相同点)
    参照上述let代码
  3. const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动,对于简单类型的数据(数字,字符串,布尔值)而言,值就保存在变量指向的内存地址中,因此等同于常量,但对于复合数据类型(对象,数组)而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,这完全不能控制,因此,将一个数组或对象声明为常量时要谨慎
        const obj = {};
        obj.name = 'jisoo';
        obj.age = 25;
        console.log(obj);//上述代码都没有问题,可以给对象进行属性的添加操作
        obj={};//Error,因为不能将obj指向另外一个对象
        const arr = [];
        arr.push('blackpink'); //blackpink
        console.log(arr.length); //1上述代码都没有问题,因为数组是可读写的,可以添加新的元素给数组
        // arr = ['jisoo'];//Error,因为不能将此数组赋值给另外一个数组

猜你喜欢

转载自blog.csdn.net/Angela_Connie/article/details/110756948