面试手写题
sleep/delay
sleep
函数既是面试中常问到的一道代码题,也是日常工作,特别是测试中常用的一个工具函数。
js
const sleep = (seconds) => new Promise(resolve => setTimeout(resolve, seconds))
function delay (func, seconds, ...args) {
return new Promise((resolve, reject) => {
setTimeout(() => {
Promise.resolve(func(...args)).then(resolve)
}, seconds)
})
}
实现深拷贝
- 实现了函数拷贝、Map、Set、Array拷贝
js
// 获取正则表达式 修饰符(标记)
function __getRegExpFlags(re) {
var flags = '';
if (re.global) flags += 'g';
if (re.ignoreCase) flags += 'i';
if (re.multiline) flags += 'm';
return flags;
}
// 获取数据类型
function getType(obj){
return Object.prototype.toString.call(obj).slice(8,-1);
}
function cloneDeep(obj){
const ret = {}
for(let key in obj){
const value = obj[key];
let cloneValue = null
// 如果是函数
if(typeof value === 'function'){
cloneValue = value.bind(ret);
}
else if(Array.isArray(value)){
for(let val of value){
cloneValue = cloneDeep(val)
}
}
// 考虑正则表达式
else if(getType(value) === "RegExp"){
cloneValue = new RegExp(value.source, __getRegExpFlags(value));
}
else if (getType(value) === "Date") {
cloneValue = new Date(value.getTime());
// 处理Map
}else if(getType(value) === "Map"){
const map = new Map()
for(let key in value){
map.set(key ,cloneDeep(value[key]))
}
cloneValue = map;
}
// 处理Set结构
else if(getType(value) === "Set"){
const set = new Set()
for(let key in value){
set.set(key ,cloneDeep(value[key]))
}
cloneValue = set;
}
else if(getType(value) === "object"){
cloneValue = cloneDeep(val)
}else{
cloneValue = value
}
ret[key] = cloneValue
}
return ret
}
const obj = {
re: /hello/,
f() {},
date: new Date(),
map: new Map(),
list: [1, 2, 3],
set:new Set([12,3]),
a: 3,
b: 4,
};
const objClone = cloneDeep(obj)
// 测试map
obj.map.set("num",1)
console.log(obj.map.get("num"))
// 这里出问题
console.log(objClone.map.get("num"));
obj.set.add(0)
console.log(obj.set)
console.log(objClone.set)
const re = /hello/
console.log(re.source)