虽然每年都在使用这三个关键字,要说不知道是包不认的,但要说能回答完整,也要思考思考,今天偶然自问不才,作文以记之。
先来讲讲const吧
const 声明用于声明块作用域的局部变量。常量的值不能通过使用赋值运算符重新赋值来更改,但是如果常量是一个对象,它的属性可以被添加、更新或删除。
const和let都是ES6引入的,他们十分类似。声明在块内部的常量,其作用域仅限于该块内部。
我们通常使用const来声明一个常量,因为const声明的常量不会轻易更改,但也不是不可更改,官方文档中说明了不能通过使用赋值运算符重新赋值来更改,但声明的对象却可以。比如你可以喊你男/女朋友不同的昵称,ta都是ta,也即是说,const是声明所指的地址不可变,但内容数据(如属性)还是可以变的。 同时呢,const声明的时候一定要赋值,不然就会报错。
const //必须赋值
const num1=12
num1=2 //报错 TypeError: Assignment to constant variable.
const arr=[1,2,3]
arr.push(4)
console.log(arr); //[ 1, 2, 3, 4 ]
关于var 和 let 应该这才是面试官要主要考我们的
-
首先呢 就是全局污染上的区别
var foo = "Foo"; // globally scoped
let bar = "Bar"; // globally scoped but not part of the global object
console.log(window.foo); // Foo
console.log(window.bar); // undefined
用var定义一个foo 全局对象window上就会多一个foo,而bar则不会。 但是有个有趣的现象,如果你的标签中有一个id为b,那么b也会到window上去。同时呢 let也可以和var一样跨标签使用。
-
第二点呢 就是块级作用域
用
let、var声明的变量的作用域是最靠近并包含let、var声明的以下花括号闭合语法结构的一个:但是呢 let 多了一个作用域,就是块级作用域,在块语句、
try...catch、switch以及其中一个for语句的头部,对于var并不创建作用域,而在这样的块内部使用var声明的变量仍然可以在块外部被引用。 -
第三点 就是暂时性死区(TDZ)了
var是没有暂时性死区的,但是let和const都有,简单点来说就是你在声明之前是无法访问的,大家都知道,因为var有变量提升,但是let没有吗,其实呢,你可以说有,也可以说没有。
对于提升呢 没有一个准确的定义,更多的是我们开发人员的一种感觉。
-
还有一个呢 就是重复声明
var可以重复声明,而 let不允许重复声明,因此为了代码的规范,我们更多地推崇比如在循环中使用let而不是var。