一些乱七八糟的面试题记录 - JS篇

90 阅读3分钟
1.js的数据类型,以及用什么方法判断数据类型

基本数据类型:Number、String、Boolean、Null、Undefined、Symbol、BigInt 引用数据类型:Object、Array、Function、Date、RegExp

  1. typeof 只能判断基本数据类型, typeof在判断引用数据类型时,只有function返回的是function,其他返回的都是object
  2. instanceof只能判断引用数据类型,原理是检测某个对象是不是另一个对象的实例
  3. Object.prototype.toString.call() 可以判断所有类型,会返回一个形如 "[object XXX]" 的字符串,如果对象的 toString() 方法未被重写,就会返回如上面形式的字符串,但是,大多数对象,toString() 方法都是重写了的,这时,需要用 call() 或 Reflect.apply() 等方法来调用
2.闭包(高频)

外层函数里面嵌套一个函数,里面的函数就叫做闭包,即指有权访问另一个函数作用域的变量的函数

  • 优点:可以读取到外层函数内部的变量,延长局部变量的生命周期实现变量数据共享;模拟块级作用域
  • 缺点:会导致函数的变量一直保存在内存中,过多的闭包可能会导致内存泄漏
  • 应用场景:节流、防抖、自执行函数、使用回调函数就是在使用闭包、柯里化
3.Event Loop
  • JS作为浏览器运行的脚本语言,其主要用途就是操作DOM,所以决定了它只能是单线程,否则会带来很多复杂的问题。但是单线程会导致任务需要一个一个排队去执行,如果一个任务执行时间过长,后面的任务就会一直等待,为了解决这个问题,JS引入事件循环。
  • Event Loop:在JS中,所有的任务都可以分为同步任务和异步任务,所有的同步任务会进入到主线程,形成一个执行栈,异步任务则会进入到Event Table中并注册回调函数,当指定的事情完成后,Event Table会将这个函数压入任务队列中,当主线程将执行栈中所有的任务执行完毕后,就会读取任务队列中的任务,主线程会先检查微任务队列中是否有任务,如果有,则依次执行;之后去检查宏任务队列中是否有任务,如果有则将第一个宏任务压入执行栈,执行完毕后再去检查微任务队列中是否有任务,如此循环,形成js的事件循环机制
  • 异步任务分为宏任务和微任务
  • 宏任务:script、settimeout、setinterval、UI render
    
  • 微任务: promise.then、 async await 、process nextick
    
4.原型和原型链

原型:构造函数的prototype是实例的__proto__的原型

原型链:当我们访问一个对象的属性的时候,如果该对象内部没有此属性,则会通过对象身上的隐式原型__proto__去原型中查找。找到则返回,如果最终没有返回就返回undefined,原型链的终点是Object的__proto__,也即null。这种链式查找的过程就叫做原型链。