var
全局变量不小心覆盖掉别人已经使用的变量,会导致一些很奇葩的bug,并且难以定位。这时候let
和const
变量的优势就展现出来了,不能在同一个作用域中重复声明同一个变量。
<script>
let count = 10;
let discount = 0.9;
const key = 'abc123';
if(count > 5){
console.log('ran');
let discount = 0.5;
}
</script>
这个在控制台中let discount
还是输出0.9
,而块级作用域中的let discount = 0.5
并没有覆盖之前的变量,这是因为let
变量在块级作用域中只对所在的区域起作用,和全局中的毫无干系。
接下来要说的是let
和const
的不同之处:
let
变量可以在不同作用域中重复声明,但是const
变量不可以。
<script>
const person = {
name:'lucy',
age:20
}
console.log(person)
</script>
在后台控制台中输出person={name:'bool'}
会出现报错,但并不是说const
声明的变量是不可以改变的,它的属性还是可以改变的。继续输出person.age=21
,然后age
成功变成21
,改变了person
的属性,这是因为person
赋值为一个对象,对象是一种引用类型的值,当你如果重新赋值一个新的对象时,这个指针就指向另外一个地方,指向了两个不同的地方那就不是同一个对象。也可以这么理解:一个人是无法改变的,但是她的年龄会随时间的流逝而改变。只要人你不改变,改变其他的属性也是可以的。
当然啦,如果你连属性值也不想让别人修改的话可以使用Object.freeze()
方法。如下
<script>
const person = {
name:'lucy',
age:20
}
console.log(person)
const lucy = Object.freeze(person);
</script>
最后总结一下:let
值是可以更新的,const
值是不可以更新的,但是你要注意它是引用类型的时候哦。
网友评论