注:给自己写的复习和面试的笔记,简要记录可能不完善,复习够用
一、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保证引用类型的不变性内部属性可变