1. JavaScript 中声明变量的关键字有哪些?它们的区别是什么?JavaScript 中声明变量的方式有 3 种:var(ES5)、let 和 const(ES6) 三者的区别在以下几点:

  • 作用域(作用范围)
    • var 声明的变量,其作用范围由函数来划分,即函数作用域;
    • let 和 const 声明的变量,其作用范围由大括号 {} 来划分,即块级作用域;
  • 变量提升
    • var 声明的变量存在变量提升;
    • let 和 const 声明的变量不存在,因为暂时性死区。
  • 重复声明
    • var 声明的变量允许重复声明(后面的声明会覆盖前面的声明);
    • 在同一作用范围内,let 和 const 声明的变量不允许重复声明;
  • 重新赋值

    • var 和 let 声明的变量允许通过重新赋值来更改变量值;
    • const 声明的变量不允许重新赋值,因此 const 声明的变量也可以称之为「常量」。

      2. 什么是变量提升?

      浏览器解析代码的过程主要分为两个部分:编译和执行。
      其中编译也叫做「词法解释」或「预解析」,在这个阶段所有代码都还没有开始执行,但浏览器会对当前作用域中的代码进行解析,并在解析过程中找到所有通过 var 关键字声明的变量,然后将这些变量的声明全部提升到当前作用域的顶部,而变量的赋值留在原位置。这个过程,就叫做「变量提升」。
      等编译阶段完成后,才开始进入代码执行阶段,浏览器会按照编译之后的顺序依次执行代码。

      3. JavaScript 中有哪几种数据类型?

      6+1,即 6 种基本数据类型 + 1 种引用数据类型
  • 基本数据类型:number、string、boolean、null、undefined、Symbol(ES6 新增)、BigInt(ES10 新增)

  • 引用数据类型:object

    4. null 和 undefined 的区别是什么?

  • null 是一个空对象指针,表示”没有对象”,即该处不应该有值;

  • undefined 表示”缺少值”,就是此处应该有一个值,但是还没有定义;

    5. 什么是自由变量?

    在当前作用域以外声明的变量,对于当前作用域来说,这个变量就是自由变量。

    6. NaN 是什么数据类型?它的特点是什么?

    NaN 表示非数字,属于 number 类型。它的特点主要体现在以下两点:

  • 任何涉及到 NaN 的运算,结果都会返回 NaN;

  • NaN 与任何值都不相等,包括 NaN 本身;

    7. JavaScript 中数据类型之间的强制转换方法有哪些?

  • parseInt()、parseFloat()、Number():强制转换为 number 类型,其中 parseInt() 转换为整数、parseFloat() 转换为浮点数(小数);

  • String()、toString():强制转换为 string 类型;
  • Boolean():强制转换为 boolean 类型;

    8. == 和 === 的区别是什么?

    == 在进行比较时会对数据类型进行自动转换,而 === 不会。因此 === 在执行效率上比 == 更高。

    9. typeof 的作用是什么?它的返回值有哪些?

    typeof 用于判断数据所属类型。
    它的返回值是一个字符串,有 6 种取值:”string”、”number”、”boolean”、”undefined”、”object”、”function”。

    10. JavaScript 中哪些数据经过 Boolean() 转换后的值为 false?

    “”、false、null、undefined、0、NaN

    11. 下面代码的输出是什么?( B )

    console.log(typeof typeof 1);

  • A: “number”

  • B: “string”
  • C: “object”
  • D: “undefined”