const
const跟let一样是es6中新的声明方法,很多的特性跟let是一样的。
特性
1.不可变更性
- 声明简单的类型时,该变量无法修改,这就意味着不能声明不赋值
- 声明的非简单的类型的数据时,可以在不改变改数据的内存地址的情况下,修改数据
const a=1
a=2
//报错
const a={b:1}
a.b=2
console.log(a)
a=3
// {b:2}
// 报错
从上面的例子可以看出来,其实const声明的值不是不可以改变,而是该变量指向的内存地址不能改变,在声明为一个常量的时候,变量的指针就是指向该常量,常量改变地址指向改变,所以报错。当时对于复合型数据,变量指向内存地址,不发生改变,也就是变量直接赋值成其他的值,内部的数据结构还是内容都是可以变化得。
2.无法变量提升
console.log(a)
var a=1
// undefined
console.log(a)
const a=1
// 报错
3.存在const不能重复定义
var a=1
var a=2
// 正常
const a=1
const a=2
// 报错
var a=1
const a=2
// 报错
let a=1
const a=2
//报错
只要同一作用域内存在相同变量被声明都会报错
4.只在块级作用域内生效
var a=1
if(true){
const a=2
}
console.log(a)
// 1
5.块级作用域内只能够拿到该作用域内声明的const变量,外部被忽略
var a='博主好帅'
if(true){
console.log('博主不帅')
const a
}
// 报错
报错,并没有打印(说明博主还是很帅的嘛),块级作用域内存在const定义,就算外部定义了也会报错。
顶层对象的属性
在ES5中,顶层对象的属性和全局属性是等价的,在流浪器端window为顶级对象,在Node环境中global为顶级对象。
//es5
var a=1
console.log(window.a)
// 1
//es6
let a=1
console.log(window.a)
// undefined
可以看出在es5中全局用var function声明还是跟全局挂钩的,而从es6开始,let const class等都不是挂在window上了