主要区别:
1、var、let声明变量;const声明常量
var data1 = 11;
data1 = 111;
console.log(data1);//222
let data2 = 22;
data2 = 222;
console.log(data2);//222
const data3 = 33;
data3 = 333;//Uncaught TypeError:分配给常量变量。
console.log(data2);
2、var声明变量存在变量提升,let、const不存在变量提升
console.log(name1);//undefined
var name1 = "小马哥";
// 上面两句等同于下面三句
var name2;
console.log(name2);//undefined
name2 = "小马哥";
try {
console.log(sex);
let sex = "nan";
} catch (error) {
console.log(error);//ReferenceError:初始化之前无法访问“sex”
}
try {
console.log(age);
const age = 31;
} catch (error) {
console.log(error);//ReferenceError:初始化之前无法访问“sex”
}
不过,const声明的基本数据不可变,但引用类型的值是可以改变的:
const data4 = { name: "小马哥" }
data4.name = "-_-!";
console.log(data4);//{name:"-_-!"}
const data5 = [31]
data5[0] = 23;
console.log(data5);//[23]
3、let、const、var作用域之间的区别
//首先作用域大体分两种:全局、局部;细分三小种:全局作用域、函数作用域、块级作用域
// 一、在全局作用域中定义,均为全局作用域
// 一、在全局作用域中定义,均为全局作用域
var vvable1 = "小马哥"
let lvable1 = 31;
const cvable1 = "nan";
// 全局作用域
console.log(vvable1, lvable1, cvable1);//小马哥 31 nan
// 函数作用域
function setMsg1() {
console.log(vvable1, lvable1, cvable1);//小马哥 31 nan
}
setMsg1();
// 块级作用域
if (true) {
console.log(vvable1, lvable1, cvable1);//小马哥 31 nan
}
// 二、在块级作用域中定义,只有var会变成上一级,其余都是块级作用域
// 二、在块级作用域中定义,只有var会变成上一级,其余都是块级作用域
if (true) {
var vvable2 = "小马哥"
let lvable2 = 31;
const cvable2 = "nan";
console.log(vvable2, lvable2, cvable2);//小马哥 31 nan
}
console.log(vvable2);//小马哥
try {
console.log(lvable2);
} catch (error) {
console.log(error);//ReferenceError:未定义lvable2
}
try {
console.log(cvable2);
} catch (error) {
console.log(error);//ReferenceError:未定义cvable2
}
// 三、在函数作用域中定义,均为函数作用域
// 三、在函数作用域中定义,均为函数作用域
function setMsg2() {
var vvable3 = "小马哥"
let lvable3 = 31;
const cvable3 = "nan";
console.log(vvable3, lvable3, cvable3);//小马哥 31 nan
}
setMsg2();
try {
console.log(vvable3);
} catch (error) {
console.log(error);//ReferenceError:未定义lvable2
}
try {
console.log(lvable3);
} catch (error) {
console.log(error);//ReferenceError:未定义lvable2
}
try {
console.log(cvable3);
} catch (error) {
console.log(error);//ReferenceError:未定义cvable2
}
// 可以简单理解,var能穿透块级作用域({}包括区域),但不能穿透函数作用域,let和const只能在块级作用域({}包括区域)中
总结一下:
1、var、let声明变量;const声明常量
2、var声明变量存在变量提升,let、const不存在变量提升
不过,const声明的基本数据不可变,但引用类型的值是可以改变的:
3、let、const、var作用域之间的区别
一、在全局作用域中定义,均为全局作用域
二、在块级作用域中定义,只有var会变成上一级,其余都是块级作用域
三、在函数作用域中定义,均为函数作用域
最后发现有个问题,打印输出name居然输出了值,比较愚钝看了半天没能理解,也希望大佬能解惑一下。
console.log(name);
var name = "小马哥";
本文用以记录和个人分析,若有错误和误导行为,还请大家指出,多多包涵,欢迎各位大佬指导!