JS中var、let、const区别

734 阅读3分钟

一、var声明的变量会挂载在window上,而let和const声明的变量不会

var a = '我是a';
console.log(a,window.a);//我是a--我是a

let b = "我是b";
console.log(b,window.b);//我是b---undefined

const c = "我是c";
console.log(c,window.c);//我是c---undefined

二、var声明变量存在变量提升,let和const不存在变量提升

console.log(a);//undefined ==> a已经声明但没有赋值
var a = "我是a";

console.log(b);//报错:c is not defined  ===> 找不到b这个变量
let b = "我是b";

console.log(c);//报错:c is not defined  ===> 找不到b这个变量
const c = "我是c";

三、let和const声明形成块作用域

{
    var a = "我是a";
    let b = "我是b";
    const c = "我是c";
}
    console.log(a);//我是a
    console.log(b);//b is not defined
    console.log(c);//c is not defined
    //以上报错找不到b,c两个变量

如果对以上还不能了解的同学,给你讲一个故事:
在块作用域中用var声明可以理解成var很大方,var的家里({})有一台游戏机(a),而这个游戏机(a)同意给外人(块作用域外)带出去玩
但是let和const比较自私,他们各自的游戏机,仅供在自己家里的人玩

四、同一作用域下let和const不能声明同名变量,而var可以

var a = "我是a";
var a = "haha";
console.log(a);//haha
let b = "我是b";
let b = "haha";
console.log(b);//控制台报错:Identifier 'b' has already been declared  ==> 标识符b已经被声明了
const c = "我是c";
const c = "haha";
console.log(c);//控制台报错:Identifier 'c' has already been declared  ==> 标识符c已经被声明了

五、暂存死区TDC

let a = "我是a";
    function fnc(){
        a = 10;
        //在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a
        let a;// 而这时,还未到声明时候,所以控制台Error:a is not defined
    }
    fnc();

六、const常量

//1、一旦声明必须赋值
const a;
console.log(a);//Missing initializer in const declaration ==>常量声明中缺少初始值设定项
//2、声明后不能再修改
//3、如果声明的是复合类型数据,可以修改其属性
const b = {
    name:'haha'
}
b.name = 'CodeJN';
b.age = 21;
console.log(b.name);//CodeJN
console.log(b.age);//21

const c = [];
c[0] = 12;
c[1] = 13;
console.log(c);//[12,13]

补充一个知识点:(传值)(传址)

function one(){
    let a = 20let b = a;
    b = 20-1;
    console.log(a,b);//20--19
}one();
function two(){
    let a = {
        Sedan:'Parra Mela'
    }
    let b = a;
    //a的Sedan:Parra Mela
    console.log("a的Sedan:" + a.Sedan);
    //b的Sedan:Parra Mela
    console.log("b的Sedan:" + b.Sedan);
     b.Sedan = 'Audi A8';
     //a的Sedan:Audi A8
     console.log("a的Sedan:" + a.Sedan);
     //a的Sedan:Audi A8
     console.log("b的Sedan:" + b.Sedan);
}two();

看不懂的同学,来继续听故事了:a(父亲)b(儿子)
one函数:

b对a说:爸给我包烟(父亲内心:行吧,要就给你一包呗,咱家条件还行,给你一包不碍事)  
所以b拥有了跟a一样的烟(值),那么这包烟(值)就归b所有,而a的烟还没抽,b抽了一根,所以a还是20,b就成了19。  

two函数:

b对a说:爸买辆车给我呗(父亲内心:你个瓜娃子,你要你爹半条命呀,还给你买车,我这有辆Parra Mela你拿去开吧)  
然后b开了a的车,在这种情况下,这辆车就是公用的,所以a和b获取的属性Sedan的值都是Parra Mela  
但是b私下把他老子的Parra Mela给换成了Audi A8(虽然他老子的肺快炸了,但没办法谁让自己亲儿子呢)  
所以只能跟b开了同款Audi A8,也就成了b改了属性Sedan的值成了Audi A8之后,a和b的属性值都是Audi A8。  

JN还是一个前端小白,文章技术如有什么错误,跪求大佬们指出!!跪谢啦