主要面试题整合

主要面试题整合

-主要面试题整合

https://blog.csdn.net/qq_33277654/article/details/112758362?utm_source=app&app_version=4.5.5


面试官:在 JS 中为什么 0.2+0.1>0.3?⭐⭐⭐⭐

  • js 中   浮点数使用固定 64 位来表示, 其中的 1 位表示符号位,11 位用来表示指数位,剩下的 52 位尾数位,由于只有 52 位表示尾数位。
  • 0.1 转二进制是一个无线无限循环数,js 也只存储后 52 位尾数位,从内存中取出后就缺少精度。
  • 0.1+0.2 = 0.3000000000000000000004
  • 但·0.2+0.3 =0.5 的
    •     因为 0.2 和 0.3 的 52 为尾数位都是 0,
    • 面试官:那既然 0.1 不是 0.1 了,为什么在 console.log(0.1)的时候还是 0.1 呢?⭐⭐⭐
    • 答:**在**console.log**的时候会**二进制转换为十进制,十进制再会转为字符串的形式,在转换的过程中发生了取近似值,所以打印出来的是一个近似值的字符串

面试官:判断数据类型有几种方法⭐⭐⭐⭐⭐

  • typeof
    • 缺点会把 null 当为 Object,因为 js 会把这些转为二进制,Object 判断条件是前三位是 0 就是对象。null 全是 0,所以被当成 object 了
  • instanceof
    • 只能判断对象是否存在于目标对象的原型链上
    • instanceof 原理实际上就是查找目标对象的原型链
  • constructor
    • 找构造函数、父类、也可以判断类型、比较全面
  • Object.prototype.toString.call(数据)
    • 基本数据类型都可以判断

call、apply、bind⭐⭐⭐⭐⭐

https://www.runoob.com/w3cnote/js-call-apply-bind.html

  • call、apply 第一个参数可改变 this 指向、第二个参数传参数、call 可以一个参数一个参数写、apply 需要传递一个数组。写了自动执行(相当于在执行函数时对其进行了魔改。)
  • bind 参数传递、以及 this 指向改变和 call 一样,但它会返回一个函数。而 bind 由于返回一个函数,需要再次手动调用。
  • 例子:(上下写法结果一致)
  • 使用 String 的 prototype 中的字符串方法,然后用 call 改变本是指向 Sting 的 this。让其指向 call 参数中的 this
  • 直接自己调用字符串方法。


面试官:字面量创建对象和 new 创建对象有什么区别,new 内部都实现了什么,手写一个 new⭐⭐⭐⭐⭐

  • new 可以创建一个空对象
  • 使新对象的proto  指向原函数的 prototype
  • 并使 this 指向该空对象,并执行该函数,执行结果保存起来作为 result
  • 判断执行函数的返回结果是不是 null 或者 undefinded.如果是空就返回创建的新对象。不是的话就返回该函数的返回值。

–显式原型:每个函数function 都有一个 prototype,这个就是显式原型

–隐式原型:每个实例对象都有一个proto,这个就是隐式原型也就是 函数的是显式原型,实例对象的是隐式原型。


执行栈和执行上下文

面试官:什么是作用域,什么是作用域链?⭐⭐⭐⭐

  • 变量以及函数的可使用范围被称作作用域
  • 每个函数都有一个作用域链、查找变量或者查找函数时、从局部作用域到全局作用域依次查找、这些作用域的集合就是作用域链(当前变量对象+所有父级变量对象)

面试官:什么是执行上下文?⭐⭐⭐⭐

  • 就是 js 的执行顺序
  • 全局执行上下文
    • 就是创建全局 window 对象,执行 js 的时候就会最先压入执行栈底、浏览器关闭后才会弹出
  • 函数执行上下文
    • 每次函数被调用时,都会创建一个函数执行上下文、
    • 函数执行上下文分为创建阶段和执行阶段
      • 创建阶段基本可概括为声明、确定 this 指向、确定作用域
      • 执行阶段就是变量赋值、函数引用等
  • eval 执行上下文   基本不

面试官:什么是执行栈 ?⭐⭐⭐⭐

  • 首先栈的特点是先进后出
  • 但进入一个执行环境,就会创建执行上下文、然后进行压栈、当程序执行完成是、他的执行上下文就会销毁、进行弹栈
  • 最上面的执行上下文有下面所有执行上下文的变量对象属性。
  • 一定是全局执行上下文最先执行、栈底的一定是全局执行上下文、栈顶的一定是函数执行上下文。只有游览器关闭了、全局执行上下文才会弹出

面试官:什么是闭包?闭包的作用?闭包的应用?⭐⭐⭐⭐⭐

函数执行、形成私有的上下文、使内部私有变量不受外界干扰、起到保护和保存的作用

  • 避免变量污染全局
    • vue 中组件的 data 是一个函数 数据写在返回值中
  • 变量不会被回收
  • 避免命名冲突

–  一般写使用 return 返回一个匿名函数保存变量

–  或者使用 自执行函数 (function(){})() 实现闭包

保护

避免命名冲突

保存

解决循环绑定引发的索引问题,for 循环中如果不用 let 声明变量,则函数体可以使用闭包的方式保存变量。

变量不会销毁

可以使用函数内部的变量,使变量不会被垃圾回收机制回收

应用:

设计模式中的单例模式

for 循环中的保存 i 的操作

防抖和节流

函数柯里化

缺点

会出现内存泄漏的问题


原型和原型链

面试官:什么是原型?什么是原型链?如何理解⭐⭐⭐⭐⭐

原型:

每个对象都有一个隐式原型(proto) 、该对象指向的构造函数则是一个显示原型(prototype)

原型链:

原型链的本质就是proto,  多个proto就组成了原型链。

  • 所有的实例的proto都指向他们构造函数的 prototype
  • 所有的 ptototype(原型)都是对象、自然他们的proto(原型链)最上面都是 Object()的 protype(最抽象的)。
  • 所有的构造函数的隐式原型指向的都是 Function()的显示原型
  • Object 的隐式原型(proto)是 null,就是没得、Object 是最抽象最上层得了。

继承

面试官:说一说 JS 中的常用的继承方式有哪些?以及各个继承方式的优缺点。⭐⭐⭐⭐⭐

原型继承、组合继承、寄生组合继承、ES6 的 extend(多用)


内存泄露、垃圾回收机制

面试官:什么是内存泄漏⭐⭐⭐⭐⭐

  • 不用得内存没有别正确及时释放出来、导致这段内存无法被使用。就是内存泄漏。

面试官:为什么会导致的内存泄漏⭐⭐⭐⭐⭐

  • 内存泄漏指我们无法在通过 js 访问某个对象,但垃圾回收机制任务该对象还在被引用、因此垃圾回收机制不会释放该对象、导致内存一直无法被释放、积累太多、系统就会变卡甚至崩溃。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!