相信大家在学习刚开始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声明的变量,不能修改其指针指向,但可以修改其存储值。