Web/06-JavaScript进阶/01-var、let、const的区别.md

105 lines
2.6 KiB
JavaScript
Raw Normal View History

2020-06-03 23:02:10 +08:00
## varletconst的区别
### var声明的变量存在变量提升let和const声明的变量不存在变量提升
var 声明的变量
```js
console.log(a); // 打印结果undefined ==> a已经声明但没有赋值
var a = '我是a';
```
let 声明的变量
```js
console.log(b); // 打印结果报错Uncaught ReferenceError: Cannot access 'b' before initialization ==> 找不到b这个变量
let b = '我是b';
```
const 声明的变量
```js
console.log(c); // 打印结果报错Uncaught ReferenceError: Cannot access 'c' before initialization ==> 找不到c这个变量
const c = '我是c';
```
### 暂时性死区 DTC
2020-06-04 14:49:45 +08:00
**举例1**表现正常
2020-06-03 23:02:10 +08:00
```js
const name = 'qianguyihao';
function foo() {
console.log(name);
}
foo(); // 执行函数后打印结果smyhvae
```
上方例子中 变量 name 被声明在函数外部此时函数内部可以直接使用
**举例2**报错
```js
const name = 'qianguyihao';
function foo() {
console.log(name);
const name = 'hello';
}
foo(); // 执行函数后控制台报错Uncaught ReferenceError: Cannot access 'name' before initialization
```
2020-06-04 14:49:45 +08:00
代码解释如果在当前块级作用域中使用了变量 name并且当前块级作用域中通过 let/const **使 DTC**DTC
关于暂时性死区的更多介绍详本项目的另一篇文章ES6变量
2020-06-03 23:02:10 +08:00
2020-06-05 23:33:06 +08:00
## const 常量能不能被修改
我们知道 const 声明的变量无法被修改但还有一点我们一定要记住
- 如果用 const 声明基本数据类型则无法被修改
- 如果用 const 声明引用数据类型对象这里的无法被修改指的是**不能改变内存地址的引用**但对象里的内容是可以被修改的
举例1不能修改
```js
const name = 'qianguyihao';
name = 'vae'; // 因为无法被修改所以报错Uncaught TypeError: Assignment to constant variable
```
举例2不能修改
```js
const obj = {
name: 'qianguyihao',
age: 28,
};
obj = { name: 'vae' }; // 因为无法被修改所以报错Uncaught TypeError: Assignment to constant variable
```
举例3可以修改
```js
const obj = {
name: 'qianguyihao',
age: 28,
};
obj.name = 'vae'; // 对象里的 name 属性可以被修改
```
2020-06-03 23:02:10 +08:00
## 参考链接
- [JS中varletconst区别](https://juejin.im/post/5e49249be51d4526e651b654)