面试官:你说说 var、let、const 三者的区别
前言
面试官:“你说说 var、let、const 三者的区别”
紧张的萌新:“var 没有块级作用域,let 有......”
面试官:“...”
······
大家好,我是 CoderBin,本次又来到了面试官系列,变量声明作为面试当中的高频考点,如果只是回答块级作用域是远远不够的,而它们涉及知识点也是我们准备面试时需要去注意的,这样才能比较全面的回答出它们之间的区别。所以本文将总结 var、let、const 相关的基础知识,帮助大家掌握这道面试题。如果是大佬就当做复习吧,哈哈,希望对大家有帮助,谢谢!
如果文中有不对、疑惑的地方,欢迎在评论区留言指正🌻
高频面试总结
面试官系列文章
一、var 声明
在 ES5 中,顶层对象的属性和全局变量是等价的,用
var
声明的变量既是全局变量,也是顶层变量
注意:顶层对象,在浏览器环境指的是window
对象,在 Node
指的是global
对象
使用
var
声明的变量存在变量提升的情况
在编译阶段,编译器会将其变成以下执行
使用
var
,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明
在函数中使用使用
var
声明变量时候,该变量是局部的
而如果在函数内不使用
var
,该变量是全局的
二、let 声明
let
是 ES6 新增的命令,用来声明变量,作用和 var 差不多。最明显的区别是:let
声明的范围是块作用域,而var
声明的范围是函数作用域。
用法类似于
var
,但是所声明的变量,只在 let 命令所在的代码块内有效
不存在变量提升
这表示在声明它之前,变量 a 是不存在的,这时如果用到它,就会抛出一个错误
只要块级作用域内存在
let
命令,这个区域就不再受外部影响
使用let
声明变量前,该变量都不可用,也就是大家常说的“暂时性死区”
let
不允许在相同作用域中重复声明
注意的是相同作用域,下面这种情况是不会报错的
因此,我们不能在函数内部重新声明参数
防止变量泄露
在 let 出现之前,for 循环用 var 定义的迭代变量会渗透到循环体外部。改用 let 之后,这个问题就消失了,因为迭代变量的作用域仅限于 for 循环内部:
三、const 声明
const
的行为与let
基本相同,唯一一个重要的区别是用它声明变量必须同时初始化,且尝试修改const
声明的变量会导致运行时错误
const
声明一个只读的常量,一旦声明,常量的值就不能改变
这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值
如果之前用
var
或let
声明过变量,再用const
声明同样会报错
const
实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动
对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量
对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的,并不能确保改变量的结构不变
其它情况,const
与let
一致
四、它们之间的区别
var
、let
、const
三者区别可以围绕下面五点展开:
变量提升
暂时性死区
块级作用域
重复声明
修改声明的变量
使用
1. 变量提升
var
声明的变量存在变量提升,即变量可以在声明之前调用,值为undefined
let
和const
不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错
2. 暂时性死区
var
不存在暂时性死区
let
和const
存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
3. 块级作用域
var
不存在块级作用域
let
和const
存在块级作用域
4. 重复声明
var
允许重复声明变量
let
和const
在同一作用域不允许重复声明变量
5. 修改声明的变量
var
和let
可以
const
声明一个只读的常量。一旦声明,常量的值就不能改变
6. 使用
能用const
的情况尽量使用const
,其他情况下大多数使用let
,避免使用var
五、风格声明及最佳实践
ECMAScript 6 增加 let 和 const 从客观上为这门语言更精确地声明作用域和语义提供了更好的支持。行为怪异的 var 所造成的各种问题,已经让 JavaScript 社区为之苦恼了很多年。随着这两个新关键字的出现,新的有助于提升代码质量的最佳实践也逐渐显现。
1. 不使用 var
有了 let
和 const
,大多数开发者会发现自己不再需要 var
了。限制自己只使用 let
和 const
有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。
2. const 优先, let 次之
使用 const
声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,很多开发者认为应该优先使用 const
来声明变量,只在提前知道未来会有修改时,再使用 let。这样可以让开发者更有信心地推断某些变量的值永远不会变,同时也能迅速发现因意外赋值导致的非预期行为。
六、最后总结
关于 var、let、const 的基础知识到这里的讲完了,最后来总结一下它们各自的特点吧
1. var 特点
声明作用域(函数作用域)
变量提升
可重复声明同个变量
全局声明的变量会成为全局对象的属性
2. let 特点
块级作用域
不存在变量提升
不允许重复声明
防止变量泄露(for 循环的迭代变量)
3. const 特点
声明变量时,同时初始化
块级作用域
暂时性死区
不可修改
不允许重复声明
不能用来声明迭代变量
往期推荐 💐 🌸 🌹 🌻 🌺 🍁
高阅读好文:
【3】Vue内置指令大全
每文一句:老骥伏枥,志在千里。烈士暮年,壮心不已——曹操
本次的分享就到这里,如果本章内容对你有所帮助的话欢迎点赞+收藏。文章有不对的地方欢迎指出,有任何疑问都可以在评论区留言。希望大家都能够有所收获,大家一起探讨、进步!
版权声明: 本文为 InfoQ 作者【CoderBin】的原创文章。
原文链接:【http://xie.infoq.cn/article/be839e9aee53b935febea8836】。文章转载请联系作者。
评论