背景
在写js和ts代码的时候,经常会用到var、let、const关键字,虽然一直用,但是从来没有去仔细研究他们之间的区别,偶尔遇到的使用的问题,就直接换了另一个关键字,其中最明显的就是我使用const没有进行初始化发现不行,就直接换成使用let就可以了,这篇文章就是为了研究其他之间的区别
一、var变量
1、var在全局作用域的应用,使用var关键字声明的变量,都会被提升到该作用域的最顶部,这就是我们常说的变量提升
console.log(a); //undefind
var a = 1;
console.log(a); //1
等同于
var a;
console.log(a); //undefined
a = 1;
console.log(a); //1
全局变量
在函数外声明的变量作用域是全局的:
var carName = "Volvo";
function person(){
console.log(carName); // "Volvo"
}
person();
局部变量
在函数内声明的变量作用域是局部的(函数内):
function person() {
var carName = "Volvo";
console.log(carName); // "Volvo"
}
person();
console.log(carName); //报错 Uncaught ReferenceError: a is not defined
使用 var 关键字在块级作用域存在的问题
var a = 10;
console.log(a); // 10
{
var a = 2;
console.log(a); // 2
}
console.log(a); // 2
重置变量
使用 var 关键字声明的变量在任何地方都可以修改:
var x = 2;
console.log(x); // 2
var x = 3;
console.log(x); // 3
二、块级作用域let、const
let、const声明和var声明用法一样,不同点在于let、var声明的是变量,const声明的是常量。var存在变量提升,let、const不存在变量提升。var在全局作用域声明的变量会挂载在window对象上
1、let 声明
let声明的是变量,没有var那样的变量提升,let声明的变量只在当前作用域中有效
全局变量
console.log(x);//报错 Unexpected identifier 'Uncaught'
let x = 1;
console.log(x);// 1
块级作用域
let 中不存在变量提升
{
console.log(x); //报错 Unexpected identifier 'Uncaught'
let x = 1;
console.log(x);
}
重置变量
在相同的作用域或块级作用域中,不能let关键字来重置 var 关键字声明
var x = 2; // 合法
let x = 3; // 不合法
{
var x = 4; // 合法
let x = 5 // 不合法
}
在相同的作用域或块级作用域中
let x = 2; // 合法
let x = 3; // 不合法
{
let x = 4; // 合法
let x = 5; // 不合法
}
let 关键字在不同作用域,可以重新申明和赋值
let x = 2; // 合法
{
let x = 3; // 合法
}
{
let x = 4; // 合法
}
2、const 声明
const声明的是常量,常量不可以修改。常量定义必须初始化值,如果不初始化值就会报错。
全局变量
{
console.log(x); //报错 Unexpected identifier 'Uncaught'
const x = 1;
console.log(x); // 1
}
局部变量
{
const x = 1;
console.log(x); //1;
}
console.log(x)// 报错 Unexpected identifier 'Uncaught'
必须初始化,不能重新赋值
const x;
console.log(x);// Uncaught SyntaxError: Missing initializer in const declaration
const x = 10;
x = 20; // 报错,const 变量不可重新赋值
对象和数组,对于引用类型(对象和数组),const 保证的是变量引用的地址不变,但对象或数组本身是可以修改的。
const x = [1, 2, 3];
x.push(4); // 合法,数组本身可以修改
x = [5, 6, 7]; // 报错,变量引用地址不可变
总结
let、var声明的是变量,const声明的是常量。var存在变量提升,let、const不存在变量提升。var在全局作用域声明的变量会挂载在window对象上,而let const声明的变量则不会有这一行为。let声明的是变量,没有var那样的变量提升,let声明的变量只在当前作用域中有效,const声明的是常量,常量不可以修改。常量定义必须初始化值,如果不初始化值就会报错。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。