今天我们来聊下 ES6 的另一个 关键字 const
一、const 关键字
const 是 constant(常量)的缩写,const 和 let 一样也是来声明变量的,但 const 是专门用来声明一个常量的,那么既然是常量,它的值是不能改变的。不像以前用 var 声明的变量 随便改。
可见,碰到const 该改收收你们任性的代码了!
二、谈谈常量
1.不可修改
const Name='张'; Name = 'zhang' // 错误,不可修改常量 Name
2.只在块级作用域起作用,这点和 let 一样
if (x) { const Name='张' } alert(Name) // 错误,在代码块{}外,Name 不起作用
3.不存在变量提升,必须先声明后使用,也和 let 一样
if (x) { alert(Name) // 错误,使用前未声明 const Name='张' }
4.不可重复声明同一个变量也和 let 一样
var Name='张' ; const Name='张' // 错误 变量已经声明 ,不可重复声明
5.声明后必须要赋值
const NAME; // 错误 声明后没赋值
三、const 声明 对象
先看代码
const Person = { 'name':'张' } Person.name='王'; Person.age=20; console.log(Person) // 输出 {'name':'王','age':20 }
不是说好的常量不能修改么。搞事情...
淡定 , 听我说!
这里现讲一个概念:传址赋值
在赋值过程中,我们分为传值赋值和 传址赋值 ,这里就讲讲我们用到的 传址赋值
传址:在赋值过程中,变量存储的实际上是 数据的地址,而不是原始数据 或者对数据的拷贝。
不太明白,没事,先看代码
var person1={'name':'张'} var person2=person1 person2.name='王' console.log(person1) // 输出 {name:'王'} console.log(person2) // 输出 {name:'王'}
为什么person2 的name 改了以后 person1 的也变了,这就是传址赋值
举个例子:比如 你预约了一个染发师小王,小王沿着你给的地址来了你家 给你把头发染成 奶奶灰色。
过了几天,你觉得他染得不行而且发色 不好看,又预约了小李,小李沿着地址同样来到你家,给你把头发改善了下,并染成 亚麻色。
那么不管谁来你家,按你地址来的见到你 发色 一定是 亚麻色,因为,最后一次 的染发 是亚麻色。
再看代码
// 小王给你染得奶奶灰 var wang={hair:'奶奶灰'} // 过了几天,你让小李来,并告诉了他地址 var li=wang // 小李给你染得亚麻色 var li={hair:'亚麻色'} // 那么不管谁来你家,你的发色一定是亚麻色 console.log(wang) // 输出 {'hair':'亚麻色'} console.log(li) // 输出 {'hair':'亚麻色'}
翻到开始的那个代码,结构都一样,应该明白了吧。
回到我们的关键字 const ,用 const 来声明 一个对象类型的常量,就是传址赋值。而不可修改的是 对象在内存中的地址,而不是对象本身(不变的你家的地址而不是你的发色)
所以上面那段代码console 的时候能正常输出了
var person1={'name':'张'} var person2=person1 person2.name='王' console.log(person1) // 正常输出 {name:'王'} console.log(person2) // 正常输出 {name:'王'}
但是,如果这样写就要报错了
var person1={'name':'张'} person1={} // 错误,给常量person1 重新赋值(即改变你家地址)
小结:
const是用于声明一个常量,并必须赋值,声明后不可修改,和 let 一样,只在块级作用域 起作用,不可重复声明同一个变量,不会有变量提升的情况,声明引用类型的常量时,要注意传址赋值。
ok!