var、let、const 注给自己写的复习和面试的笔记简要记录可能不完善复习够用一、var的核心特性1、作用域函数作用域或全局作用域痛点缺乏块级作用域if块内的变量会泄露到外部for循环中的变量会泄露到外部2、变量提升声明被提升初始化为undefined痛点声明前访问不报错值为undefined违反代码直觉易导致bug3、重复声明允许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 }二、letES6的变量声明可以理解为升级版的var1、作用域块级作用域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、提升与TDZvar变量提升声明前可访问值为undefinedlet/const存在暂时性死区声明前访问抛出ReferenceError3、赋值与声明var可重复声明可重新赋值let不可重复声明可重新赋值const不可重复声明不可重新赋值const保证引用类型的不变性内部属性可变