前端面试手写题系列 V

前端面试手写题系列 V

前端面试 手写题系列 已经完结,包含了以下的题目:

手写拍平数组 flat
手写防抖和节流函数
手写深拷贝
手写快排
手写 call、apply、bind
手写一个 sleep 函数
手写冒泡排序
函数柯里化
对象扁平化
手写 new 过程
求数组中的最大值
手写 instanceof
手写 foreach 函数
手写迭代器
手写 filter
实现一个 compose 函数
正则相关(去哪儿原题)
实现一个任务调度函数(得物原题)
数组转化为 tree
不使用 a 标签,实现 a 标签的功能
手写插入排序
LRU 算法
归并排序
求两个数组的交集、并集、补集、差集
提取 url 中的参数
实现一个洗牌函数 shuffle
希尔排序

1.手写 foreach 函数

手写 foreach 函数:遍历执行函数

// 手写 forEach
Array.prototype.myForEach = function (fn) {
    if (typeof fn !== 'function') {
        throw new Error('请传入一个函数')
    }
    for (let i = 0; i < this.length; i++) {
      // 第一个参数是 this 的指向,第二个参数是传给 fn 的参数值
        fn.call(this, this[i])
    }
}

const arr = [1, 2, 3]
arr.myForEach(item => {
    console.log(item + 1)
})

控制台:

PS C:\Users\wy151\Desktop\demo> node demo.js
2
3
4

2.手写迭代器

在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能附带一个返回值。
更具体地说,迭代器是通过使用 next() 方法实现了迭代器协议的任何一个对象,该方法返回具有两个属性的对象:

  • value:即迭代序列的下一个值
  • done:如果已经迭代到序列中的最后一个值,则它为 true。如果 value 和 done 一起出现,则它就是迭代器的返回值

一旦创建,迭代器对象可以通过重复调用 next() 显式地迭代。迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次:在产生终值后,对 next() 的额外调用应该继续返回 {done:true}。

//手写迭代器
function myGenerator(arr) {
	// 这个对象中包含两个属性:值 + 是否迭代完成
	let index = 0;
	return {
		next: function () {
			return index < arr.length ? {
				value: arr[index++],
				done: false
			} : {
				value: undefined,
				done: true
			};
		}
	}
}

let gen = myGenerator([1, 2]);
console.log(gen.next());
console.log(gen.next());
console.log(gen.next());

控制台:

PS C:\Users\wy151\Desktop\demo> node demo.js
{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }

3.手写 filter

作用:

filter的基本功能是遍历一个数组,并返回一个符合过滤条件的新数组且不改变原有数组。

// 语法: arr.filter(function(currentVal, index, arr),thisVal)
//手写filter
//把filter方法挂载到Array构造函数的原型上来模拟
Array.prototype.myFilter = function (func, thisVal) {
	//判断第一个参数是否为函数
	if (typeof func !== 'function') return '请输入一个函数';
	//确定回调函数的this指向
	let arr = this;
	//定义返回值
	let filterArr = [];
	//对数组进行遍历
	for (let i = 0; i < arr.length; i++) {
		let temp = func.call(thisVal, arr[i]);
		if (temp) {
			filterArr.push(arr[i]);
		}
	}
	return filterArr;
}

//测试用例
let arr = [1, 2, 3, 4, 5]
let res = arr.myFilter(item => item !== 1) // 这里并没有写第二个参数,thisVal
console.log(res);

控制台:

PS C:\Users\wy151\Desktop\demo> node demo.js
[ 2, 3, 4, 5 ]

手写题系列文章

前端手写题系列 I
前端手写题系列 II
前端手写题系列 III
前端手写题系列 IV
前端手写题系列 V
前端手写题系列 VI
前端手写题系列 VII
前端手写题系列 VIII
前端手写题系列 IX
前端手写题系列 X

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 实现一个数组去重的函数 思路:使用对象来存储数组中的元素,遍历数组,若元素在对象中不存在,则存储到对象中,并将其推入新数组中。 2. 实现一个函数,判断一个字符串是否是回文字符串 思路:将字符串翻转,与原字符串比较是否相等。 3. 实现一个函数,可以将多维数组转化为一维数组 思路:使用递归来遍历多维数组,将每个元素推入新数组中,直到遍历完所有元素。 4. 实现一个函数,统计一个字符串中出现次数最多的字符 思路:使用对象来存储每个字符出现的次数,遍历字符串,将每个字符存储到对象中,找到出现次数最多的字符。 5. 实现一个函数,实现数组的冒泡排序 思路:使用双重循环遍历数组,比较相邻两个元素的大小,如果前者大于后者,则交换两个元素的位置,直到遍历完数组。 6. 实现一个函数,实现数组的快速排序 思路:选择数组中的一个元素作为基准点,将数组分为两个部分,一部分大于基准点,一部分小于基准点,递归处理两个部分。 7. 实现一个函数,实现数组的深拷贝 思路:使用递归遍历数组中的每个元素,判断元素类型,如果是对象或数组,则进行深拷贝,如果是基本类型,则直接复制。 8. 实现一个函数,实现函数的柯里化 思路:使用闭包保存参数,当参数个数达到预设值时,执行函数。 9. 实现一个函数,实现函数的节流 思路:使用定时器来控制函数执行的频率,每次函数执行时,清除定时器并重新设置一个定时器。 10. 实现一个函数,实现函数的防抖 思路:使用定时器来延迟函数执行,每次函数执行时,清除定时器并重新设置一个定时器。如果在定时器延迟时间内再次触发函数,则重新计时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城南顾北

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值