ECMAScript 6.0(也可以称为ECMAScript2015),ECMAScript 6.0简称 ES6,是 JavaScript 语言的下一代标准。ES6有很多实用的新特性, 其中最常用到的可能就是 let 和 const 了,下面就来聊聊这两个很实用的特性吧。
var 和 块级作用域
在ES6之前,根据作用域的范围划分变量可分为两种:全局变量,函数内的局部变量。
全局变量:(在函数外声明的变量,任何地方都可以访问)
var color = "red";
// 这里可以使用 color 变量
function myFunction() {
// 这里也可以使用 color 变量
}
局部变量:(在函数内部声明的变量,只有在函数内可以访问)
// 这里不可以使用 color 变量
function myFunction() {
var color = "red";
// 这里也可以使用 color 变量
}
// 这里也不可以使用 color 变量
为了更好的比较 let ,const 和 var 的区别,还需要聊另一个概念,即块级作用域(Block Scope)。
使用 var 关键字声明的变量不具备块级作用域的特性,它在 {} 外依然能被访问到。如下:
{
var color = "red";
}
// 这里可以使用 color 变量
看了上面的代码,是不是就有点疑惑了,在块级作用域内var可以被访问,在块级作用域外还是可以访问,那如果块级作用域的内外都有var声明的变量会怎样呢?
var color = "red";
// 这里输出 color 为 red
{
var color = "blue";
// 这里输出 color 为 blue
}
// 这里输出 color 为 blue
由上面的例子我们可以看到,块级作用域外的变量被作用域内的变量重写了,这并不是我们想看到的结果,我们希望一些能按照规则来,就像是在函数内外声明的变量一样,变量只负责自己区域内的事情。
而如果想达到这种效果,仅靠 var 来实现是很困难的,于是就有了 let 和 const 。
let 和 const
直接上代码
{
let color = 'red';
const color2 = 'blue'
}
// 这里不能使用 color 变量,也不能使用 color2 变量的
上面代码很直接的展示了 let 和 const 的优势,即声明的变量只在块级作用域内起作用。
有了这个功能,那刚才的问题就迎刃而解了。
var color = "red";
// 这里输出 color 为 red
{
let color = "blue";
// 这里输出 color 为 blue
}
// 这里输出 color 为 red
除此之外,let 和 const 还具备以下特征:
- 不存在变量提升
- 声明变量之前,该变量都是不可用的
- 不允许重复声明
当然let 和const 之间也是有区别的,其实let 和 var 是很相似的,可以把他 let 看作是限制了作用域的var ,而const 和let 也很相似,只是它还具备一些额外的属性,例如:
- const 声明一个只读的常量。一旦声明,常量的值就不能改变。
- const 一旦声明变量,就必须立即初始化,
总之就是不要想着去改变 const 的值,如果是一个可能会被改动的值,那就不要用 const!
当然了,准确地说,const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
const obj = {
color: 'red'
};
obj.color = 'blue';
console.log(obj.color); //这里的值是blue, 虽然obj的值改变了,但是引用地址并没有变