ES6常量声明方式——const
上一篇说了ES6变量声明方式let( https://blog.csdn.net/juliaandjulia/article/details/107524107),今天就来聊聊ES6常量的声明方式。
定义常量
在ES5中定义一个常量:
Object.defineProperty(window,'PI',{
value:3.14,
writable: false
})
console.log(PI)//3.14
PI=5
console.log(PI)//3.14
在ES6中定义一个常量
//典型报错
const a=5
a=6//报错,常量不可以改变
const b//报错,常量必须赋初始值
b=6
//const声明的数组、对象的值可以被改变,不能改变的是变量的引用地址
const obj={
name:'wdl',
age:18,
}
console.log(obj)//{name: "wdl", age: 18}
obj.school='gdut'
obj.name='www'
console.log(obj)//{name: "www", age: 18, school: "gdut"}
const arr=[1,2,3]
arr.push(4)
console.log(arr)//[1,2,3,4]
//要是想固定值不变,可以用Object.freeze()冻结
const obj={
name:'wdl',
age:18,
skill:{
name:'code',
year:11
}
}
console.log(obj)//{name: "wdl", age: 18, skill: {name: 'code', year: 11}}
Object.freeze(obj)//freeze只能传对象不能传数组 做浅层冻结
Object.freeze(obj.skill)//手动递归冻结第二层
obj.school='gdut'
obj.skill.year=12
console.log(obj)//{name: "wdl", age: 18, skill: {name: 'code', year: 11}}
const声明常量拥有块级作用域
常见的作用域分为以下几个类型:
对象 | 类型 |
---|---|
window/global | 全局作用域 |
function | 函数作用域/局部作用域 |
{} | 块状作用域 |
this | 动态作用域 |
更多关于作用域建议阅读(.https://www.kancloud.cn/kancloud/you-dont-know-js-scope-closures/516609)
const声明的块级作用域:
if(true){
const a=5
}
console.log(a)//报错 a未定义 a仅在块级作用域有效
const不存在变量提升
先来看看什么叫变量提升。
var 声明的变量会在任意代码执行前处理,这意味着在任意地方声明变量都等同于在作用域顶部声明——即声明提升(可以在声明语句之前使用)。
console.log(a)//undefine (打印出undefined而不是报错,可见var存在变量提升)
var a = 5
//相当于
// var a
// console.log(a)
// a=5
function foo(){
console.log(b)
var b=5
}
foo()//undefined
//相当于
//function foo(){
// var b
// console.log(b)
// b=5
//}
//foo()
更多关于变量提升建议阅读 (深入理解js中变量提升: https://github.com/creeperyang/blog/issues/16.)
const声明的常量不存在变量提升
if(true){
console.log(a)//报错 const声明不存在变量提升,a必须先声明再使用
const a=5
}