const throttle = (fn, delay = 500) => { let flag = true; return (...args) => { if (!flag) return; flag = false; setTimeout(() => { fn.apply(this, args); flag = true; }, delay); };};十二、实现深拷贝以下为简易版深拷贝,没有考虑循环引用的情况和Buffer、Promise、Set、Map的处理,如果一一实现,过于复杂,面试短时间写出来不太现实,如果有兴趣可以去这里深入实现:
深拷贝终极探索[2] 。
const clone = parent => { // 判断类型 const isType = (target, type) => `[object ${type}]` === Object.prototype.toString.call(target) // 处理正则 const getRegExp = re => { let flags = ""; if (re.global) flags += "g"; if (re.ignoreCase) flags += "i"; if (re.multiline) flags += "m"; return flags; }; const _clone = parent => { if (parent === null) return null; if (typeof parent !== "object") return parent; let child, proto; if (isType(parent, "Array")) { // 对数组做特殊处理 child = []; } else if (isType(parent, "RegExp")) { // 对正则对象做特殊处理 child = new RegExp(parent.source, getRegExp(parent)); if (parent.lastIndex) child.lastIndex = parent.lastIndex; } else if (isType(parent, "Date")) { // 对Date对象做特殊处理 child = new Date(parent.getTime()); } else { // 处理对象原型 proto = Object.getPrototypeOf(parent); // 利用Object.create切断原型链 child = Object.create(proto); } for (let i in parent) { // 递归 child[i] = _clone(parent[i]); } return child; }; return _clone(parent);};
【面试 前端面试这些API必须会手写】
推荐阅读
- 油价下跌,再学会这些省油技巧,用车成本降一半
- 这些习惯容易影响肠胃健康,你有没有?越早改掉,肠胃越健康
- AT/CVT/DCT变速箱该怎么选?看完这些不再纠结
- 华为手机录屏没有声音,该如何解决?别急!试试这些方法
- iPhone越用越卡顿?不妨看看原因和这些解决方法
- 手机如何才能更省电?这些小技巧一定要知道
- 水果的这些“小秘密”,你都知道吗?
- 祛斑养颜茶这些茶多喝几杯你会更美
- Android面试题集锦之 Service
- 如果这些专业术语都搞不懂,你就不要在音响行业混了