前言:ES6平时在工作中应用诸多,但掌握的都太浅显,用的也都很基础,
于是买了本阮一峰的《ES6标准入门(第三版)》,在看这本书的同时也寄
希望能借助写博客的方式帮助自己重新梳理、记忆相关知识点以及养成写博客
的习惯。在这个系列里我整理的基本都是书上已有的,会加入一些自己的理解,
并做一些适当的缩减,如有错误望指出[抱拳]感谢!
1、let和const命令
1.1 let命令
let命令是ES6新增命令,用于声明变量。用法类似于var,但是声明的变量只在let命令所在的代码块内有效。
{
let a = 1;
var b = 2
}
console.log(b); //2
console.log(a); //Uncaught ReferenceError: a is not defined
总结一下就是let声明的变量只在自己的块级作用域内有效,超出调用则
会报错。而var定义的变量是全局变量,只要定义了全局都生效。
现在在实际开发过程中除非必要情况,用的一般都是let,已经很少去
用var定义变量了,主要也是为了避免全局的变量污染。
1.1.1 let不存在变量提升
这个做了解就好,变量提升就是按理论来说,变量只能在声明该变量的语句之后才能使用该变量。
但var声明的变量可以在声明之前使用,值为undefined,let命令则是纠正了这种情况,如果在声明之前使用会直接报错。
1.1.2 暂时性死区
只要块级作用域内存在let命令,它所声明的变量就绑定的这个区域,不在受外部影响。
var tmp = 123;
if(true){
tmp = 'abc'; //ReferenceError
let tmp;
}
这个可以理解为只要我在某个块级作用域内用let、const声明了某个变量,这个块级作用域就会锁死该变量。跟变量提升一样,在声明之前引用的话会直接报错。
这个在语法上被称为“暂时性死区”(temporal dead zone,简称TDZ)
1.1.3 不允许重复声明
let不允许在相同作用域内重复声明同一个变量。
function(){ //报错
let a = 1;
var a = 2;
}
function(){ //报错
let a = 1;
let a = 2;
}
function(arg){ //报错
let arg;
}
function(arg){
{ //正常
let arg;
}
}
1.2 const命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const a = 10;
a = 11; //报错
const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
对于一些简单类型的数据(数值、字符串、布尔值)来说,值就保存在变量指向的内存地址中,因此等同于常量,不能进行改动。
但对于数组和对象来说,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于指向的数据结构是不是可变的,这完全不可控。
const foo = {};
//添加属性
foo.a = 1;
console.log(foo.a); //1
//将foo指向另一个对象 则会报错
foo = {}; //报错
坚持写博第1/100天;加油!奥里给!