以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?
第八天要刷的面试题如下:
- 判断对象a和类A之间的关系
- 数组中和遍历相关的方法
- 对比forEach和map
- 对比call和apply
- js中实现异步的方式
下面是我自己的理解:
1. 判断对象a和类A之间的关系
a instanceof A
a.constructor?.name === A.name
a.constructor === A
Object.getPrototypeOf(a) === A.prototype
A.prototype.isPrototypeOf(a)
!!Object.prototype.toString.call(a).slice(8,-1) === A.name
是不可以的!
2. 数组中和遍历相关的方法
forEach
: forEach 方法用于遍历数组中的每个元素,并对每个元素执行提供的回调函数。它没有返回值,仅用于执行操作或副作用。map
: map 方法创建一个新数组,其中包含原始数组经过回调函数转换后的每个元素。它会将回调函数的返回值按照相同顺序组成新数组并返回。filter
: filter 方法创建一个新数组,其中包含原始数组中满足给定条件的所有元素。它通过将每个元素传递给回调函数并根据回调函数的返回值(true 或 false)来筛选元素。for...of
: for...of 是一种循环语句,用于遍历可迭代对象(如数组、字符串、Set、Map 等)的每个元素。它提供了一种简单且直观的方式来迭代和访问元素。every
: every 方法用于检查数组中的所有元素是否都满足给定的条件。它会对数组中的每个元素应用回调函数,只有当所有元素的回调函数都返回 true 时,every 方法才返回 true;否则返回 false。some
: some 方法用于检查数组中是否存在至少一个元素满足给定的条件。它会对数组中的每个元素应用回调函数,只要有一个元素的回调函数返回 true,some 方法就返回 true;否则返回 false。find
: find 方法返回数组中满足给定条件的第一个元素。它会对数组中的每个元素应用回调函数,直到找到使回调函数返回 true 的元素,然后立即返回该元素。findIndex
: findIndex 方法返回数组中满足给定条件的第一个元素的索引。它会对数组中的每个元素应用回调函数,直到找到使回调函数返回 true 的元素,然后返回该元素的索引。reduce
: reduce 方法通过将数组中的每个元素依次应用回调函数来将数组减少为单个值。回调函数接收累加器和当前元素作为参数,并返回累积结果。最终的返回值是回调函数的最后一次调用结果。reduceRight
: reduceRight 方法与 reduce 方法类似,不同之处在于它从数组的末尾开始迭代元素,而不是从头部开始。其他方面的行为与 reduce 相同。
3. 对比forEach和map
forEach
: forEach 方法用于对数组中的每个元素执行一个提供的回调函数。它会遍历数组的每个元素,并为每个元素执行回调函数,但它没有返回值。forEach 通常用于执行副作用,例如修改原始数组、打印输出或其他与每个元素相关的操作;map
: map 方法创建一个新数组,该数组包含原始数组经过回调函数转换后的每个元素。它会遍历数组的每个元素,并将每个元素传递给回调函数进行处理,最后返回一个新数组,其中包含了每次回调函数的返回值。- 对于空值的处理的差异:forEach和map对空白元素可以都可以看成循环中的continue,但map返回的数组依然保留空白元素位置!
const arr = [1, null, 3, undefined];
delete arr[0];
arr.forEach(v=>console.log(v)); // null 3 undefined
arr.map(v=>String(v)); // [空白, 'null', '3', 'undefined']
4. 对比call和apply
两者的作用一摸一样,使用ES6实现这两个函数的时候,其差异仅仅体现在形参的第二个参数前面有没有展开运算符
- apply接受两个参数,第一个指定了函数体中this的指向对象;第二个参数可以是数组或者类数组,apply会将第二个参数中的元素作为参数传递给内部函数。
- call接受多个参数,第一个指定了函数体中this的指向对象;第二个参数之后的所有参数会作为新的参数序列传递给内部函数。
5. js中实现异步的方式
有四种方式:回调函数、Promise、Generator、async异步函数:
回调函数
:存在回调地狱出现的风险Promise
: 比回调函数嵌套要好,但是层数过深的时候仍然语义不是很明确generator
: 通过转移函数的执行权来实现异步功能,基于协程实现异步函数
: 是generator和promise实现的一个自动执行的语法糖,所谓自动执行指的就是:如果异步函数内部执行到一个await语句的时候,这个语句返回一个promise对象,那么异步函数就会等待promise对象的状态resolve之后再继续向下执行,实现了异步函数内部异步过程的同步书写的形式。