6.11 var let const


Babel转码器,将es6 => es5

var

用于定义变量,存在变量提升

let

用于定义变量,不存在变量提升

let的一些特性

let不存在变量提升

conslog.log(a);
let a = 10; //报错

同一个作用域内不能重复定义一个名称

var a = 1;
let a = 1;//报错

a = 1;
let a = 1;//报错

存在块级作用域

出现{ }就是有块级作用域

function test() {
 let a = 10;
 if (true) {
    let a = 1;
 }
 console.log(a);//10
}

暂时性死区

function f3(i) {
   let i = 10;
   console.log(i);
}
f3(33);//报错,同名
函数参数,会先赋值
var i = 33;
let i = 33;

let a = b, b = 3;
consloe.log(a,b);//报错 b未定义

小案例

var arr = [];
for (var i = 0;i < 5;i++) {
   arr[i] = function() {
      console.log(i)
   }
}
arr[0]();
...
arr[4](); //全是5


//解析:
//for循环中
for() {
  var i = 0;
   arr[i] = function() {
      console.log(i)
   }
   i < 5
   i++;
   ....
   arr[i] = function() {
      console.log(i)
   }
   i < 5
   i++;
   //直到 i = 5,此过程中函数并没有调用,因此最后i=5
   然后再调用函数,显而易见i的值是5
  //如果将var换成let,则不会出现这样的情况,因为let存在块级作用域,输出的结果是正常值
}

const

声明一个只读常量,常量的值不能改变,const也拥有let的三大特性

const x = 1;
x = 2;//报错 不能修改
const x;  //报错,const变量一旦声明,必须要付初值

const的坑
首先我们回顾一下,变量的知识点,数据分为简单类型和引用类型,简单类型存储在栈里面,而引用类型则在栈中存储一个指针,指向堆中存储的数据,因此我们const一个obj,只是保证栈中的数据不变,也就是地址(指针)不变,而在堆中的值是可以改变的

const obj  = {id: 1};
obj.id = 2; //正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值