【Javascript】2021手撕Javascript面试题

1.手写一个深拷贝

// 深克隆
function deepClone(sourceData){
	// 判断数据类型
	let dataType =  Object.prototype.toString.call(sourceData).slice(8,-1);
	if(dataType === 'Object'){
		// 1.当前数据类型为对象
		let subData  = {};
			// 遍历当前对象属性并递归克隆
		for(let key in 	sourceData){
			subData[key]  =deepClone(sourceData[key])
		}
		return subData;
	}else if(dataType === 'Array'){
		//2.当前数据类型为数组
		let subArr = [];
			//遍历当前数组递归
		for(let i=0;i<sourceData.length;i++){
			subArr[i] = deepClone(sourceData[i]);
		}
		return subArr;
	}else if(dataType === 'Data'){
		//3.当前数据类型为日期
		return new Data(sourceData.valueOf())
	}else if(dataType === 'RegExp'){
		//4.当前数据类型为正则对象
		return new RegExp(sourceData);
	}else if(dataType === 'Function'){
		//5. 当前数据类型为函数
		return new Function('return '+sourceData.toString()).call(this)
	}else if(dataType ==='Map'){
		//6.当前数据类型为Map
		let subMap = new Map();
		sourceData.forEach((value,key)=>{
			subMap.set(key,deepClone(value))
		})
		return subMap;
	}else if(dataType === 'Set'){
		//7.当前数据类型为Set
		let subSet = new Set();
		for (let val of sourceData.values()){
			subSet.add(deepClone(val));
		}
		return subSet;
	}
	// 8.其他数据类型直接返回
	return sourceData;
}

备注:Object.prototype.toString.call()方法

2.手写防抖与节流

2.1 防抖

 // 防抖
 function debounce(fn,delay){
 	let timer 
 	return function(){
 	if(timer){
 		clearTimeOut(timer)
 	}else{
 		timer  = setTimeout(fn,delay)
	}
  }
 }

2.2 节流

function throttle(fn,delay){
    let valid = true
    return function() {
       if(!valid){
           //休息时间 暂不接客
           return false 
       }
       // 工作时间,执行函数并且在间隔期内把状态位设为无效
        valid = false
        setTimeout(() => {
            fn()
            valid = true;
        }, delay)
    }
}

备注:

节流函数并不止上面这种实现方案,
例如可以完全不借助setTimeout,可以把状态位换成时间戳,然后利用时间戳差值是否大于指定间隔时间来做判定。
也可以直接将setTimeout的返回的标记当做判断条件-判断当前定时器是否存在,如果存在表示还在冷却,并且在执行fn之后消除定时器表示激活,原理都一样

3.手写一个Promise


4.手写一个axios

5. 排序与去重

6.闭包

7.设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值