// 1. var 作用是定义变量,声明时可以不赋值,可以在声明变量之前使用,但是没有块级作用域
// 2. let 作用是定义变量,声明时可以不赋值,不可以在声明变量之前使用,但是有块级作用域
// 3. const 作用是定义常量,声明时必须赋值,不允许重新赋值,不可以在声明常量之前使用,但是有块级作用域
// 声明时是否可以不赋值
var a; //不报错 声明时可以不赋值
let b; //不报错 声明时可以不赋值
const c; //报错 声明时必须赋值
// 声明之前打印
console.log(a1); // 不报错 可以在声明变量之前使用
console.log(b1); // 报错 不可以在声明变量之前使用
console.log(c1); // 报错 不可以在声明常量之前使用
var a1 = 'a1';
let b1 = 'b1';
const c1 = 'c1';
// 块级作用域
{
var a2 = 'a2';
let b2 = 'b2';
const c2 = 'c2';
}
console.log(a2); // 不报错,没有块级作用域
console.log(b2); // 报错,有块级作用域
console.log(c2); // 报错,有块级作用域
// 是否可以重新赋值
var a3 = 'a3';
let b3 = 'b3';
const c3 = 'c3';
a3 = 'a33'; // 不报错,允许重新赋值
b3 = 'b33'; // 不报错,允许重新赋值
c3 = 'c33'; // 报错,不允许重新赋值
// 关于const常量重新赋值的问题,做一个特别说明
// 不允许给常量重新赋值,但是当const常量保存的是一个复杂数据类型时
// const不允许修改的是栈中的内容,但可以修改堆中的内容
const c4 = { name: 'c4' };
const c5 = { name: 'c5' };
c4 = { name: 'c4' }; //报错,const常量不允许重新赋值,重新赋值栈中的内容就会发生变化
c5.name = 'c5'; //不报错,对const常量的操作,只涉及堆的修改,不涉及栈的修改,是被允许的,所以不会报错
|
|