let 、var 、const的区别!

目录

一、 var声明的变量会挂载在window上,而let和const声明的变量不会

二、变量提升

三、var没有块级作用域,let、const有块级作用域

四、在同一个作用域下var可以声明同名变量,let和const不能声明同名变量

五、const声明的是常量,必须在声明变量时就赋值,不能先声明变量再赋值

六、const定义的对象,可以更改对象的属性,也可以向对象添加属性

七、const声明的变量 赋值给一个引用数据类型的值,可以修改值里面的内容的。

八、let、const会有暂时性死区(temporal dead zone,简称TDZ),而var不存在

九、预解析


一、 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

二、变量提升

var声明的变量存在变量提升 let和const声明的变量不存在变量提升

console.log(a);
var a = 1;// 输出 undefined,变量提升,已声明未赋值

console.log(b); // Uncaught ReferenceError: Cannot access 'a' before initialization ,找不到b这个变量
let b = 10;

console.log(c); // Uncaught ReferenceError: Cannot access 'a' before initialization,找不到c这个变量
const c = 10;

变量提升,就是把定义在后面的变量或函数,提升到前面中定义。

使用 var 声明变量的时候,声明提到当前作用域的顶端,赋值操作在原处不变。

var a;
console.log(a);
a = 1;

//在函数中
function abc() {
    console.log(a);  //undefined
    var a = 123; 
};
abc();


//转换成
function abc() {
    var a;
    console.log(a);
    a = 123;
}
abc();

三、var没有块级作用域,let、const有块级作用域

if(true) {
    var a = 100;
    let b = 200; 
}
console.log(a); // 100
console.log(b); //Uncaught ReferenceError: b is not defined

四、在同一个作用域下var可以声明同名变量,let和const不能声明同名变量

var a = 20;
var a = 30;
console.log(a); // 30
let b = 10;
let b = 5;
console.log(b); //  Uncaught SyntaxError: Identifier 'b' has already been declared

五、const声明的是常量,必须在声明变量时就赋值,不能先声明变量再赋值

// 错误
const aa;
aa = 123456

// 正确
const aa = 123456

//const声明后不可修改
const aaa = 111;
    console.log(aaa);// 111
    aaa = 222;
    console.log(aaa);// Uncaught TypeError: Assignment to constant variable

六、const定义的对象,可以更改对象的属性,也可以向对象添加属性

const computer = { type: 'lenovo', color: 'black' };
// 更改属性
computer .color = 'red';
// 添加属性
computer .name= '小王';
console.log(computer ); 

七、const声明的变量 赋值给一个引用数据类型的值,可以修改值里面的内容的。

 //基本数据类型和引用数据类型的区别,变量所指向的内存空间地址不变,就可以修改值中的内容

 const abc= {
      n: 1
 };

 abc.n = 100

八、let、const会有暂时性死区(temporal dead zone,简称TDZ),而var不存在

在运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区
if (true) {
  tmp = 'abc'; // ReferenceError,未let
  console.log(tmp); // ReferenceError
  let tmp; 
  console.log(tmp); // undefined
  tmp = 123;
  console.log(tmp); // 123
}


if(true) {
   console.log(a); //  Uncaught ReferenceError: Cannot access 'a' before initialization
   let a = 500;
}

九、预解析

JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。

var声明的变量在预解析的时候只是提前的声明,function声明的函数在预解析的时候会提前声明并且会同时定义

 a()
function a(){
       console.log(b); //undefined,只声明了还没有定义,所以会输出undefined
       var b
       b=10;
       console.log(b)//10,已经定义了,所以输出24
 }
 
//由于函数的声明和定义是同时进行的,所以a()虽然是在func函数定义声明处之前调用的,但是依然可以正常的调用,会正常输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值