1.是否存在变量提升?
变量提升 --- 使用 var 来声明变量的时候,会提到当前作用域的顶端,而赋值操作在原处不变;并且也不会报错。也就是预解析(预解释)。
就相当于
var str;
console.log(str); //undefined
a = 'Hello';
fn() //1
function fn() {
console.log(1);
}
例:
console.log(a); //undefined
var a = 10;
console.log(a); // 10
console.log(b); //Cannot access 'b' before initialization --- 初始化前无法访问"b"
let b = 20;
console.log(b); // 20
console.log(c); //Cannot access 'b' before initialization
const c = 30;
console.log(c); // 30
得到结果
用var声明的变量的存在变量的提升。(函数也存在变量的提升)
用let/const声明的变量的不存在变量的提升。
2.是否存在暂时性死区?
暂时性死区 --- 就是在变量声明之前区域,使用这个变量发生报错就是暂时性死区。
例:
console.log(a); //undefined
var a = 10;
console.log(a); // 10
console.log(b); //Cannot access 'b' before initialization --- 初始化前无法访问"b"
let b = 20;
console.log(b); // 20
console.log(c); //Cannot access 'b' before initialization
const c = 30;
console.log(c); // 30
得到结果
用var声明的变量的不存在暂时性死区。
用let/const声明的变量存在暂时性死区。
3.是否允许重复声明变量?
重复声明 --- 一个标识符重复去赋值变量。
var a = 10;
var a = 20;
var a = {
name: "Hello"
}
console.log(a); // {name: 'Hello'}
let b = 10;
let b = 20;
console.log(b); // Identifier 'b' has already been declared --- 标识符“b”已声明
const c = 10;
const c = 20;
console.log(c); // Identifier 'c' has already been declared --- 标识符“c”已声明
得到结果
用var声明的变量的可以重复声明。
用let/const声明的变量不可以重复声明。
4.是否存在块级作用域?
作用域: 全局作用域 局部作用域(函数作用域) 块级作用域
块级作用域 ES6中一个{}就可以表示为一个块级作用域,但必须有let 和 const
得到结果
用var声明的变量不存在块级作用域。
用let/const声明的变量存在块级作用域。
5.是否能修改声明的变量?
var a = 10;
a = 20;
console.log(a); // 20
let b = 10;
b = 20;
console.log(b); // 20
const c = 3.1415926;
c = 2;
console.log(c); // Identifier 'b' has already been declared --- 标识符“b”已声明
得到结果
用var/let声明的变量能修改声明的变量。
用const声明的变量不能修改声明的变量。const声明的变量一般用于声明api和圆周率等不变的值。
const obj = {
name: '小明',
age: 18
}
console.log(obj); //{name: '小明', age: 18}
obj.age = 20
console.log(obj); //{name: '小明', age: 20}
补充
用const声明一个引用数据类型。可以更改引用数据类型里面的值,并且不会报错。因为赋值引用数据类型的时候其实是赋值了堆内存里的一个内存地址,只要这个内存地址不发生更改。就不会保错。但不推荐用const声明引用数据类型。因为const一般用于声明一些不变的值。