ES6学习-----let、const

哇!我终于毕业论文答辩完了,坐等毕业了,今后社会人,好兴奋!哈哈哈!安全

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

1、块级做用域是什么?为何要有块级做用域,解决了什么问题?

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

在ES6以前是没有块级变量的,所以就会出现以下的状况:spa

  • 循环变量的逃逸

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

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

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

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

2、let命令

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

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

使用let的注意点:递归

  • 一、变量必须先声明后使用;
  • 二、不容许重复声明相同变量

针对第一点,看以下代码:ci

console.log(a);
let a = 9;
复制代码

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

{
    let message = "";
    let message = "message";
}
复制代码

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

3、const命令

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

因为常量的值声明以后不能修改,因此咱们在声明常量的同时必须对其初始化。

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

  • 一、基本类型常量
  • 二、引用类型常量

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

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同样:

  • 一、变量必须先声明后使用;
  • 二、不容许重复声明相同变量

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

相关文章
相关标签/搜索