关注「松宝写代码」,精选好文,每日一题
作者:saucxs | songEagle
2020,实「鼠」不易
2021,「牛」转乾坤
风劲潮涌当扬帆,任重道远须奋蹄!
一、前言
2020.12.23 立的 flag,每日一题,题目类型不限制,涉及到JavaScript,Node,Vue,React,浏览器,http等领域。
本文是:【每日一题】(22题)面试官问:var与const let的主要区别是什么?
这是一道很宽泛的题目,如何回答更有亮点?
二、主要区别
我们先来看一下脑图,提纲挈领:
所有变量声明的方式:
- 最常见变量声明:
var、function; 全局变量,如 a=2, 若未声明变量a, 则会直接创建在全局变量中;- 在创建函数时,会默认声明
函数参数; - ES6中新增的声明方式:
let、const、import、calss。
var与const let的主要区别
1、变量提升问题
var声明的变量存在变量提升let与const声明的变量不存在变量提升,但存在暂时性死区
在预编译阶段,JavaScript引擎扫描代码时,遇到变量声明,会把var声明提到作用域的顶端,而let const声明,则会被放在暂时性死区中。
访问暂时性死区中的变量,会触发运行时错误,只有执行变量声明语句后,变量才会从暂时性死区中移除,才可正常访问。
2、重复定义问题
var声明的变量可以重复定义let与const声明的变量在同一作用域下不可重复声明
3、全局变量问题
var声明的变量可能会覆盖全局变量let与const声明的变量只可能会遮蔽全局变量,不会覆盖全局变量,即不会破坏全局作用域
4、作用域问题
-
在ES6之前,只存在
全局作用域、函数作用域:- 使用
var声明变量,可能会出现内部变量覆盖外部变量的情况 - 使用
var声明变量,循环变量会泄漏为全局变量 - ES5规定
函数声明只能在全局作用域或者函数作用域中进行,但浏览器为了兼容旧代码,不会报错
- 使用
-
ES6中,除了全局作用域、函数作用域,引入了
块级作用域的概念,如{}, if{} for(){}都会形成块级作用域:- 使用
let、const声明变量时,循环变量不会泄漏成为全局变量。在for循环中,设置循环变量与循环体内部是两个单独的作用域。 - 可以在块级作用域中进行
函数声明,需要注意的是,块级作用域必须存在{} - 规定块级作用域中:
- 在
严格模式下,函数声明语句的行为类似于let,在块级作用域之外不可引用,且会被提升至块级作用域的顶部。如果是let定义的函数表达式,不会被提示。 - 在
非严格模式下,为了兼容旧代码,最终的函数声明语句的行为类似var, 声明会被提升到外围函数或全局作用域的顶部,而不是代码块的顶部。
- 在
- 使用
let与const的主要区别
const声明的是常量,在声明后,常量指向的内存地址中保存的数据不可改动。所以:
- 对于简单类型的数据,如数值、字符串等,声明后不可在修改;
- 对于引用类型的数据,只要保持指针不变即可。
往期「每日一题」
1、JavaScript && ES6
-
第 39 题:【每日一题】(39题)谈谈JS的函数扩展?
-
第 30 题:【每日一题】(30题)面试官:ES6的解构赋值的理解?
-
第 16 题:【每日一题】面试官问:JS中如何全面进行客户端检测?
-
第 15 题:【每日一题】面试官问:JS类型判断有哪几种方法?
-
第 14 题:【每日一题】面试官问:谈谈你对JS对象的创建和引申
-
第 12 题[每日一题]面试官问:JS引擎的执行过程(二)
-
第 11 题[每日一题]面试官问:JS引擎的执行过程(一)
-
第 10 题[每日一题]面试官问:详细说一下JS数据类型
2、浏览器
3、Vue
4、React
5、HTML5
6、算法
-
第 31 道[【每日一题】(31题)面试官:你对图论了解多少?(一)
-
第 26 道【每日一题】(26题)算法题:最长公共前缀?
7、Node
8、Http
谢谢支持
1、文章喜欢的话可以「分享,点赞,在看」三连哦。
2、作者昵称:saucxs,songEagle,松宝写代码。「松宝写代码」公众号作者,每日一题,实验室等。一个爱好折腾,致力于全栈,正在努力成长的字节跳动工程师,星辰大海,未来可期。内推字节跳动各个部门各个岗位。
3、关注「松宝写代码」,是获取开发知识体系构建,精选文章,项目实战,实验室,每日一道面试题,进阶学习,思考职业发展,涉及到JavaScript,Node,Vue,React,浏览器,http等领域,希望可以帮助到你,我们一起成长~