es5中只有全局作用域和函数作用域概念,es6中提出了块级作用域的概念,就是{}包裹的区域。
目录
1、var的特性
- var存在变量提升
变量提升就是,将var声明的变量提升到作用域的最开始声明,然后得到undefined的值,而let和const不存在变量提升。
//就是在未运行到声明变量的代码之前使用该变量不会报错。
console.log(a); // undefined ===> a已声明还没赋值,默认得到undefined值
var a = 100;
console.log(b); // 报错:b is not defined ===> 找不到b这个变量
let b = 10;
console.log(c); // 报错:c is not defined ===> 找不到c这个变量
const c = 10;
- var声明的变量会挂载到window上,let和const不会
var a = 100;
console.log(a,window.a); // 100 100
let b = 10;
console.log(b,window.b); // 10 undefined
const c = 1;
console.log(c,window.c); // 1 undefined
2、let和const的特性
- let和const是块级作用域,在块级作用域外使用let声明的变量会报错
if(1){
var a = 13;
let b = 10;
}
console.log(a); // 13
console.log(b) // 报错:b is not defined ===> 找不到b这个变量
- let和const不可以重复声明,var可以重复声明,结果会被最后一次声明的赋值覆盖
var a = 100;
console.log(a); // 100
//再次声明
var a = 10;
console.log(a); // 10
let a = 100;
let a = 10;// 控制台报错:Identifier 'a' has already been declared ===> 标识符a已经被声明了。
3、const的其他特性
- const被声明时必须赋值,不能使用null占位
- const声明后的值不允许修改,但复杂类型object除外
const a = 2;
a = 5 //报错 Uncaught TypeError: Assignment to constant variable.
const arr = [1,2,3]
console.log(arr) //[1,2,3]
arr[1] = 4;
console.log(arr) //[1,4,3]
为什么复杂类型可以被修改?
因为复杂类型储存在堆上,栈上只是存储了引用的指针,只要引用地址不改变就不会触发const报错。