一、 var 和 let const 的区别

var 为 ES5 语法

  • 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
  • 可以重复声明,在全局作用域声明会自动成为window上的一个属性。
    var a
    console.log(a) // undefined
    console.log(b) // undefined
    var b = 200
    console.log(c) // 报错 c 未定义
    //ReferenceError: c is not defined
  • let 和 const 是 ES6 语法,let const 作用域为块级作用域。
  • 使用let、const 声明的变量,其作用域为该语句所在的代码块内。
  • let不能重复声明已存在的变量;
  • let 和 const 不同的是 const声明的是常量,let 声明的是变量。
  • 由于let 和 const 暂时性死区(TDZ)的存在,不能在声明前使用这个变量。(报错初始化前不能获取该变量,声明被提升了)。

    const 或 class 声明的变量可以称其从代码块的开始一直到代码执行到变量声明的位置并被初始化前,都处于一个“暂时性死区”(Temporal dead zone,TDZ)中。

// let const 作用域为块级作用域
var a = 1
let b = 2
{
    var a = 3
    let b = 4
}
console.log('a', a) // 3
console.log('b', b) // 2
// for循环创建了块级作用域
for (var i = 0; i < 10; i++) {
    var j = i + 1
}
console.log(i, j) // 10 10
for (let n = 0; n < 10; n++) {
    let m = n
}
console.log(m, n) // 报错

二、typeof 返回哪些类型

  • 值类型、引用类型(object)、函数(function)。
  • 值类型包括 number, string, boolean, undefined, bigint, symbol。

三、强制类型转换和隐式类型转换

  • 强制类型转换 parseInt, parseFloat, toString,Number(), String(), Boolean(),隐式类型转换 if、逻辑预算、==、+拼接字符串。

四、数组 pop push unshift shift

都会改变原数组:

  • pop() 从数组删除最后一个元素,并返回该元素的值。
  • shift() 方法从数组中删除第一个元素,并返回该元素的值。
  • push() 会将值放入数组最后一项,并返回数组新长度。
  • unshift()将指定元素添加到数组开头,并返回数组新长度。

五、闭包是什么?有何特性?有何影响

一个函数用到了外部的变量,那么这个函数加这个变量就组成了闭包。

闭包是作用域应用的特殊情况,有两种表现

  • 函数作为参数被传递。
  • 函数作为返回值。
  • 自由变量的查找应该从函数定义的地方,向上级作用域查找。
  • 影响:变量会常驻内存,得不到释放(不能说会造成内存泄漏,内存泄漏是应被释放的没有释放,但是闭包是可能会被用到的,需要手动释放)。