以前一直都是无脑var,仔细了解一下 const、let、var的区别,才发现能不用var就尽量不用
目录
1、存在变量提升(在变量声明之前调用,为 undifined)
1、不存在变量提升,let声明变量前,该变量不能使用(暂时性死区)
3、const的变量是对象,其对象内容可变,变量指向的地址不可变
一、var的特点
1、存在变量提升(在变量声明之前调用,为 undifined)
console.log(x); //变量声明之前调用 undifined
var x = 123;
//相当于编译过程
var x;
console.log(x);
x = 123
2、一个变量多次声明,后面声明覆盖前面
var x = 123;
var x = 321;
console.log(x) //20
3、在函数中使用 var 声明变量的时候,该变量是局部的
var x = 123;
function test(){
var x = 321; //函数内部var声明 --> 局部变量
}
test();
console.log(x); //321
4、如果在函数内不使用 var, 该变量是全局的
var x = 123;
function test(){
x = 321; //即使在函数内部,没有使用var等关键字声明 --> 变量是全局的
}
test();
console.log(x); //321
5、在一般代码块内(非函数内),不受代码块限制
开发过程中,若使用控制语句判定在特殊情形下声明变量并赋值,为false的情况下外部依然可用该变量,但是不会成立if里的逻辑,只是一个 undifined(而不是找不到变量,或者为空)
//此处受到条件控制语句false的影响,并没有成功把123赋值给id
if(false){
var id = 123;
}
console.log(id); //undefined
二、let的特点
1、不存在变量提升,let声明变量前,该变量不能使用(暂时性死区)
console.log(x) //报错:x is no defined
let a = 123;
2、在块级作用域内有效
{
let x = 123;
}
console.log(a); //报错: x is not defined
3、let不允许在相同作用域中重复声明
let x = 1;
let x = 2; //报错:Identifier 'x' nas already been declared
let y = 1;
{
let y = 2; //正确
}
三、const的特点
1、const声明一个只读的变量,声明后,值就不能改变
const x = 123;
x = 321 //不能改变,报错:Assigment to constant variable
2、const必须初始化
const x; //const常量之意:只读不可变、声明必须初始化
3、const的变量是对象,其对象内容可变,变量指向的地址不可变
const obj = {
name: '小廖'
}
console.log(obj.name); //小廖
obj.name = '大廖'
console.log(obj.name); //大廖
4、let该有的特点const都有
//不存在变量提升
//块级作用域内有效
//相同作用域下不可重复声明
四、区别
1、变量提升
var存在变量提升 --> 变量声明之前调用不报错,而是值为 undefined
let和const不存在变量提升 --> 变量声明之前调用会报错
2、块级作用域
var不存在块级作用域问题(注意:函数代码块内除外)
let和const存在块级作用域
3、重复声明(同作用域下)
var允许重复声明,后覆盖前
let和const不允许重复声明变量
4、修改变量
var和let可以修改
let和const声明的是只读常量 --> 一旦声明,常量值不可再修改(但是引用类型的值只是内存地址不可变,其里面的数据可变)
五、使用
1、const>let>var:能用const尽量使用const,多数情况使用的是let,var尽量避免使用(变量提升、非块级、声明覆盖可能在开发过程中造成麻烦问题)
2、let声明:①.没有变量提升问题,先声明再使用更规范
②.块级作用域中不会影响全局中其他变量
3、const声明:让人一看就知道此变量不可修改 --> 从而避免开发对常量值修改而产生bug
使用场景:let一般用于基本数据类型,const一般用于引用数据类型