admin管理员组

文章数量:1122853

var,let,const 声明中一般人不知道的几个点

关于var,let,const 声明变量时,有几个特别注意的点,面试的时候极容易被问到,但是很多人特别容易说不清.let的作用域呀,暂时性死区,const作用域等.

文章目录

  • 前言
  • 一、小姐姐知道的let和const
  • 二、小姐姐不知道的let和const
    • 1.let
    • 2.const
  • 总结


前言

前天公司来个小姐姐面试,长的那叫漂亮呀,清澈明亮的瞳孔,弯弯的柳眉,长长的睫毛,薄薄的双唇如玫瑰花瓣娇嫩欲滴,身材气质都超好,就是看一眼就不舍得把眼睛拿开那种,可惜有几个技术点没答上来,刚好被女总监听到,眼福就没保留下来。


一、小姐知道的let和const

问:谈一谈你认识的let和const?

答:这是ES6的新特性,主要有以下区别

  1. let 存在暂时性死区,不存在变量提升.
  2. let存在块级作用域,不能被重复声明,var声明的范围是函数作用域.
  3. const用于存储常量,且不允许被修改.

学前端的人,对于这些肯定都是知道的吧!

二、小姐不知道的let和const

1.let

问:解释一下let的暂时性死区?

答:就是在预编译的时候,像var一样声明,但是保护起来不被访问.

解析:

javascript引擎会注意到后面的let声明,但在此之前不能以任何方式来引用未声明的变量.在let声明之前的执行瞬间被称为'暂时性死区',在此阶段引用,会抛出ReferenceError的错误.

问: var在全局声明的变量是window的属性,let呢?

答:也是的.

解析:

    var name = '小甜甜';console.log(window.name);  // 小甜甜let age = 18;console.log(window.age); //  undefined/*let 声明的变量不会称为window的属性,但仍然在全局作用域生效.let 声明变量的作用域并非全域,而是在当前script域中.
*/ 

问:如下情况里面的i输出几,外面的输出几?

for (let i = 0; i < 5; i++) {
     setTimeout(()=>{
          console.log(i)
       },0)
    }
    console.log(i)

答:应该是5吧.

解析:

    for (let i = 0; i < 5; i++) {setTimeout(()=>{console.log(i)},0)}console.log(i); //Uncaught ReferenceError: i is not defined/*1 使用 let 声明的迭代变量时,js引擎会为次循环声明一个新的迭代变量.2 for本身有{},存在块级作用域,故外面不能读取其内部变量.*/

 

2.const

  问:const的值是对象时,可以被改变吗?

 答:不可以.

解析:

    const obj = {name: '小甜甜',age: 12}obj.name = '牛夫人';console.log(obj);  // {name: '牛夫人', age: 12}/*const 限制是其指向指的内存地址,并不是值得本身.*/

 问:const存在作用域吗?

答:const是在任何地方都是全局的.

解析: const是存在块级作用域的.

    const name = '小芳';if (true) {const name = '小花';}console.log(name); // 小芳

 


总结

在工作中,要多使用const,让代码解析工具提前发现不合理的赋值操作.尽量不使用var!

本文标签: VARletconst 声明中一般人不知道的几个点