ES6学习-----let、const

254 阅读3分钟

哇!我终于毕业论文答辩完了,坐等毕业了,从此社会人,好兴奋!哈哈哈!

之前的时间都在忙工作和毕业论文,毕业设计的事情,没怎么写文章,五一补补!

一、块级作用域是什么?为什么要有块级作用域,解决了什么问题?

其实块级作用域很好理解,没那么高大上!大家都知道代码块,比如if(){}while(){}等,{}大括号里边即为块级作用域。

在ES6之前是没有块级变量的,因此就会出现如下的情况:

  • 循环变量的逃逸

什么意思呢?就是说一个for循环的变量i,在for循环结束之后依旧存在而不被销毁,详细看下面的代码:

for(var i = 0; i < 10; i++) {
    
}
console.log(i); //10

上面的代码for循环结束之后依旧输出i的值为10,而不是undefined,我们就说该变量逃逸出了for代码块,从而使变量i变成了全局变量,使用不慎会导致相关的安全问题。

其实在Java中也有指针逃逸的问题,指的是执行一个方法结束之后,相应的局部变量随着该方法传递到其他方法中去了,一般是在return中将变量返回了,更多知识,请自行谷哥。

二、let命令

let命令用于声明一个块级作用域变量,和传统的var变量不同,let变量只在声明的代码块中有效,出了代码块就找不到该变量了,如下面的代码:

{
    let str = "hello world!"
    console.log(str);
}
console.log(str);//ReferenceError: str is not defined

使用let的注意点:

  • 1、变量必须先声明后使用;
  • 2、不允许重复声明相同变量

针对第一点,看如下代码:

console.log(a);
let a = 9;

上面的代码会抛出一个ReferenceError,注意是error而不是undefined。 第二点:看如下代码:

{
    let message = "";
    let message = "message";
}

上面的代码会报SyntaxError,表示变量message已经定义了。

三、const命令

const命令用于创建一个常量,常量嘛!一旦创建就不能修改,任何想改变常量的值都会报错。但这也不是绝对的,下面会讲到为什么可以对一个常量进行修改。

由于常量的值声明之后不能修改,所以我们在声明常量的同时必须对其初始化。

首先JavaScirpt中有两种类型的常量,分别是:

  • 1、基本类型常量
  • 2、引用类型常量

对于基本类型的常量,一旦声明,就不可以改变,如修改下面的常量,将报错:

const i = 8;
i = 18; // VM745:2 Uncaught TypeError: Assignment to constant variable.

对于引用类型的常量,常量所指向的地址是不能改变的,但可以改变引用的成员属性,如:

const obj = {};
obj = {a:1} // error
// obj.name = "Mike" //OK

如果想要让引用类型的常量属性整体都不能增加、删除属性,可以使用Object.freeze方法。但是还有这样一种情况,当常量对象的某个键的值又是一个引用类型时,依旧还是可以对其进行修改的。要想彻底确定一个引用常量不能被修改,还需对其所有键值执行Object.freeze方法。

var constant = (obj) => { 
    Object.freeze(obj);
    Object.keys(obj).forEach( (key,value) => { 
        if ( typeof obj[key] === 'object' ) {
            constant(obj[key]); // 递归
        }
    });
};

使用const的注意点和使用let一样:

  • 1、变量必须先声明后使用;
  • 2、不允许重复声明相同变量

谢谢阅读!欢迎评论区留言讨论、交流!