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);
}
}
prototype
和 Object.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
题库非常贴合实际的,在写的过程查漏补缺能收获了很多,强烈将牛客网推荐给大家!
如果本篇文章对你有所帮助,还请客官一件四连!❤️
声明:本站所有资源,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。