一文分清var、let和const

相信大家在学习刚开始js的时候,接触var是最多的,通过var来声明变量,而在往后的学习可能又遇到了let和const,那么这三个有什么区别呢?

var和let的区别

  • var是ES3中声明变量的方式 ,而let是ES6中声明变量的方式
  • var拥有变量提升,而let存在变量提升,所以只能先声明后再使用
console.log(num);//输出 undefined
var num = 10;
console.log(num);//输出 10
// 这里的代码会报错,Cannot access 'num' before initialization
// 在变量初始化前无法访问
console.log(num);
let num = 10;
console.log(num);
  • var在同一个执行上下文中允许重复声明,虽然浏览器只识别一次,但是不会报错,而let不允许重复声明
  • var没有块级作用域的概念,而let有块级作用域

作用域

  • 全局作用域(全局执行上下文)
    全局作用域是js中最外层的作用域,也是最先创建的,在这里声明的变量也被称作是全局变量
    -函数作用域(函数执行上下文)
    函数作用域是当函数在调用时所创建的一个新的执行上下文环境,当函数执行上下文环境创建时,会将全局上下文执行环境压入栈低,在自己的执行上下文中,执行函数内部的程序,当函数内部所有的代码都执行完毕后,再将此执行上下文环境进行出栈销毁。
    ·块级作用域
    块级作用是ES6中提供的一个新的上下文执行环境,除对象和函数的大括号外,在其余大括号中包裹的部分形成一个独立的执行上下文
for (var i = 0; i < 10; i++) {
	console.log(1);
}
console.log(i);// 输出10
for (let i = 0; i < 10; i++) {
	console.log(1);
}
console.log(i);// 在这里会报错:i is not defined

const

const声明的变量,不能重新被指向新的值(不能修改指针的方向)。

const num = 10;
num++;
console.log(num);// 报错:Assignment to constant variable 场数变量不能被赋值

那么我们这样理解,const声明的是一个常量,这个说法是正确的吗?我们再看看下面的例子

const num = {
	key:10
}
console.log(num); // 输出{key:10}
num.key = 11;
console.log(num.key);// 输出11
console.log(num);// 输出{key:11}

很明显,num的值被改变了,是因为const声明的变量,不能修改指针的指向,而可以修改指针指向的值,对象的值存储在堆结构中,而num中会存储这个对象在堆结构中的16进制地址,所以在上面例子中,我们并没有修改对象的地址,而是修改的对象的值,这时候我们就可以修改const存储的值了。
所以,const声明的变量,不能修改其指针指向,但可以修改其存储值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值