let和const
对象放入堆内存,栈内存放引入地址。
es5中,使用var定义变量,es5中没有常量的概念只有变量,在大型程序中经常需要设置一些
常量,通常变量名称以_(下划线)开头的变量,认为规定他为常量
es6中,使用新的let和const替代var定义变量。let用来定义变量,const用来定义常量
在es6中常量是指:值不能改变的变量。
const定义的常量必须初始化,初始化 = 赋值。
const a = 123;
a = 456;//报错,常量不能改变
const x;//常量在定义时就必须赋值,否则就会报错
const x = {
a:1,
b:2,
}
x.a = 123;//正确
x = {a:1,b:2};//报错
console.log(x)//常量只是规定值不能被再次赋值,如果值是引用类型,则只要指针不
变,就不算值变化
暂时性死区
变量声明提升
在执行上下文的创建阶段,要确定变量(不赋值);
console.log(a)
var a = 123;
提升为
var a;
console.log(a)
a = 123;
确定变量时,执行上下文会将当前作用域内的代码中的变量声明提升到最开始来执行,
这个现象就叫做变量声明提升。
console.log(x)
var x = 123;
var x = 456;
var x = 789;
es5中,多次重复定义同一个而变了不会报错,实际运行结果为:
var x;
console.log(x)
x = 789;
不能重复定义(TDZ)
console.log(x);
let x = 1;//报错
es6中,不存在变量声明提升。
在es6中,在当前作用域内,如果有定义局部变量x,那么这条定义会使得之前的语句都
不能访问
局部变量x,相当于let x;他会锁死之前语句访问x的权限。
暂时性死区:在当前作用域内,如果一条语句定义了变量x,那么这条语句之前的所有
其他语句都不能访问这个变量x(锁死),知道遇到这条语句才会解除锁死。被锁死的
区域就叫做暂时性死区。
因为有暂时性死区的存在,所以在es6中,变量或常量不能重复定义。
console.log(x);
let x = 1;
let x = 2;//报错
let x = 3;
因为let x = 1;处于let x = 2形成的死区中。
let、const、var的区别
es中所有声明的全局变量,window.x都可以访问的到
1、var是允许重复声明的,let,const不允许
2、var存在变量声明提升,let,const不存在
3、let、const有暂时性死区,而var没有
4、在全局作用域中,通过var声明的变量和通过function声明的函数,会自动变成
window对象的属性或者方法,而let或const有暂时性死区,而var没有。
var alert = 4//es5中全局定义的变量会自动附加到window对象上
相当于window.alert = 4;
可以在任何地方用window. 访问全局定义的变量和函数。
window.alert();//报错
fn();
function fn(){
console.dir(window.alert);//4
console.dir(alert);//undefined
var alert = 456;
}
5、var没有块级作用域
var x = 123;
aa();
function aa(){
var x = 123;
aa();
function aa(){
var x = 456;
console.log(window.x)//123
}
}
for(var i = 0; i < 10; i++){
}
console.log(i)//10
for(let i = 0; i < 10; i++){}
console.log(i)//not defined