主要面试题整合
主要面试题整合
-主要面试题整合
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 协议 ,转载请注明出处!