js 中 var、let、const 的区别

213 阅读1分钟

JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。 ES6 中新增了块级作用域。块作用域由 { } 包裹,if 语句和 for 语句里面的 { } 也属于块作用域。

1. var 声明的变量有变量提升的特性,而 let、const 没有

console.log(a)  // undefiend
var a = 10;
// 相当于
var a;
console.log(a); // undefiend
a = 10;

console.log(b)  // 报错 未定义
let b = 10;

console.log(c)  // 报错 未定义
const c = 10;

2. var 声明的变量会挂载到 windows 对象上,所以使用 var 声明的是全局变量,而 let 和 const 声明的变量是局部变量, 块级作用域外不能访问

if(true) {
    var a = 10;
    let b = 10;
    const c = 10;
}
console.log(a);  // 10
console.log(b);  // b is not defined
console.log(c);  // c is not defined

3. 同一作用域下 let 和 const 不能重复声明同名变量,而var可以

var a = 10;
let b = 10;
const c = 10;

var a = 20;
console.log(a);  // 20

let b = 20;  // 报错 b 已声明不能重复声明

const c = 20;  // 报错 c 已声明不能重复声明

4. const 的特点

 - 声明后不能再修改
 - 一旦声明必须赋值
 - 如果声明的是复合类型数据,可以修改其属性
// const a;  报错 必须赋值

let aa = 10;
aa = 20;
console.log(aa);  // 20

const a = 10;
// a = 20;  报错 不能修改

const arr = ['杨和苏'];
arr[0] = 'GAI'
console.log(arr);  // ["GAI"]

const obj = {name: '大傻'};
obj.name = '刘聪';
obj.age = 38;
console.log(obj);  // {name: "刘聪", age: 38}