1、手写instanceof

要求

补全JavaScript代码,要求以Boolean的形式返回第一个实例参数是否在第二个函数参数的原型链上。

手撕代码

const _instanceof = (target, Fn) => {
    // 补全代码
    // target实例的类型是object
     if(target === null || typeof target !== 'object') {
         return false
     }
    // Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
    let proto = Object.getPrototypeOf(target);
    while(true) {
        if(proto === null) return false;
        if(proto === Fn.prototype) return true;
        // 如果proto !== Fn.prototype,则获取proto的原型重新进行判断(逐渐收缩proto)
        proto = Object.getPrototypeOf(proto);
    }
}

prototypeObject.getPrototypeOf可查阅:MDN的解释

2、手写Array.map

要求

要求实现Array.map函数的功能且该新函数命名为”_map“。

示例:

输入:[1,2]._map(i => i * 2)
输出:[2,4]

手撕代码

手写Array.map函数之前先了解一下Array.map

  • Array.map函数接收一个回调函数,该回调函数又能接收三个参数,分别代表:
    • 数组中正在处理的当前元素
    • 数组中正在处理的当前元素的索引
    • 方法调用的数组
  • Array.map函数返回一个新数组,每个元素都是回调函数的返回值
Array.prototype._map=function(cb){
    let newArr=[]
    let _this=this
    for(let i=0;i<_this.length;i++){
        newArr.push(cb(this[i],i,_this))
    }
    return newArr
}

3、手写Array.filter

要求

要求实现Array.filter函数的功能且该新函数命名为”_filter“。

示例:

输入:[1,2]._filter(i => i>1)
输出:[2]

手撕代码

手写Array.filter函数之前先了解一下Array.filter

  • Array.filter函数接收一个回调函数,该回调函数又能接收三个参数,分别代表:
    • 数组中正在处理的当前元素
    • 数组中正在处理的当前元素的索引
    • 方法调用的数组
  • Array.filter函数返回一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组。
Array.prototype._filter = function(cb) {
    let arr = this,newArr =[];
    for(let i = 0;i < arr.length;i++) {
        if(cb(arr[i],i,arr)) newArr.push(arr[i]);
    }
    return newArr
}

4、手写Array.reduce

要求

补全JavaScript代码,要求实现Array.reduce函数的功能且该新函数命名为”_reduce“。

示例:

输入:[1,2,3]._reduce((left, right) => left + right)
输出:6

手撕代码

手写Array.reduce函数之前先了解一下Array.reduce

Array.reduce函数可接收两个参数:一个回调函数callbackFn和初始值initialValue(可选):

  • callbackFn又能接收四个参数:
    • previousValue:上一次调用 callbackFn 时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0]
    • currentValue:数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,其值则为数组索引为 0 的元素 array[0],否则为 array[1]
    • currentIndex:数组中正在处理的元素的索引。若指定了初始值initialValue,则起始索引号为 0,否则从索引 1 起始。
    • array:用于遍历的数组。
  • initialValue (可选)
    作为第一次调用 callbackFn函数时参数 previousValue 的值。若指定了初始值 initialValue,则 currentValue 则将使用数组第一个元素;否则 previousValue 将使用数组第一个元素,而 currentValue 将使用数组第二个元素。
Array.prototype._reduce = function(cb,initialValue) {
    if(typeof cb !== 'function') {
        throw new Error(`${cb} is not function`)
    }
    
    let arr=this, count, i;
    
    if(initialValue){
        count = initialValue;
        i = 0;
    }else {
        count = arr[0];
        i = 1;
    }
    for(i; i < arr.length; i++) {
        count = cb(count,arr[i],i,arr)
    }
    return count
   
}

结语

这篇文章的所有内容都出自于牛客网的JS篇题库:
在这里插入图片描述

牛客网的JS题库非常贴合实际的,在写的过程查漏补缺能收获了很多,强烈将牛客网推荐给大家!

如果本篇文章对你有所帮助,还请客官一件四连!❤️