var、let、const

var、let、const

注:给自己写的复习和面试的笔记,简要记录可能不完善,复习够用

一、var的核心特性

1>、作用域:函数作用域或全局作用域

痛点:缺乏块级作用域,if块内的变量会泄露到外部,for循环中的变量会泄露到外部

2>、变量提升:声明被提升,初始化为undefined

痛点:声明前访问不报错,值为undefined;违反代码直觉易导致bug

3>、重复声明:允许

4>\可变性:可以重新赋值

function varExample(){ console.log(a); //变量提升 值为undefined var a = 10; console.log(a);//赋值后值为10 if(true){ var a = 20;//覆盖了外层的a console.log(a);//值为20 } console.log(a);//值被if块修改输出20 }

二、let:ES6的变量声明,可以理解为升级版的var

1>、作用域:块级作用域

2>、暂时性死区(TDZ):声明前无法访问

3>、重复声明:同一作用域内不允许

4>、可变性:可以重新赋值

function letExample(){ console.log(a);//报错:变量声明前访问:暂时性死区(TDZ) let a = 10 ; console.log(a);//输出 10 if (true){ let a = 20 ;//此时的a为if块中的新变量 console.log(a);//输出 20 } console.log(a);//输出 10 不受if块的影响 }

三、const:声明即永恒

1>、作用域:块级作用域

2>、暂时性死区(TDZ):声明前无法访问

3>、可变性:不能重新赋值

4>、核心:保证变量引用的不变性

const obj = {name: 'Meng'}; //修改对象内的属性 obj.name = 'Xia' console.log(obj.name);//输出 'Xia' //将obj指向一个新对象 不允许 obj = {};//TypeError

四、关键点一暂时性死区(TDZ)

适用于let和const

区域:从作用域{开始,到变量声明let/const 结束

行为在此区域内访问变量抛出ReferenceError

关键点二:全局对象

var:在全局作用域声明,会成为window的属性

let/const:不会成为window的属性

关键点三、开发最佳实践

1、优先使用const:增强代码可预测性,避免意外修改

2、当变量需要重新赋值时使用let:循环计数器、状态切换

3、尽量不用var

五、面试回答

1、作用域

var:函数作用域

let/const:块级作用域:解决var在if/for中的变量泄露问题

2、提升与TDZ

var:变量提升,声明前可访问,值为undefined

let/const:存在暂时性死区,声明前访问抛出ReferenceError

3、赋值与声明

var:可重复声明,可重新赋值

let:不可重复声明,可重新赋值

const:不可重复声明,不可重新赋值

const保证引用类型的不变性内部属性可变