JS基础-你能回答完整let,var,const的区别吗?

146 阅读2分钟

虽然每年都在使用这三个关键字,要说不知道是包不认的,但要说能回答完整,也要思考思考,今天偶然自问不才,作文以记之。

先来讲讲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一样跨标签使用。

image.png image.png

  • 第二点呢 就是块级作用域

    用 let、 var 声明的变量的作用域是最靠近并包含 letvar  声明的以下花括号闭合语法结构的一个:

    但是呢 let 多了一个作用域,就是块级作用域,在块语句try...catchswitch 以及其中一个 for 语句的头部,对于 var 并不创建作用域,而在这样的块内部使用 var 声明的变量仍然可以在块外部被引用。

  • 第三点 就是暂时性死区(TDZ)了

var是没有暂时性死区的,但是let和const都有,简单点来说就是你在声明之前是无法访问的,大家都知道,因为var有变量提升,但是let没有吗,其实呢,你可以说有,也可以说没有。

image.png 对于提升呢 没有一个准确的定义,更多的是我们开发人员的一种感觉。

  • 还有一个呢 就是重复声明

var可以重复声明,而 let不允许重复声明,因此为了代码的规范,我们更多地推崇比如在循环中使用let而不是var。