深拷贝
function deepClone(obj) {
if(typeof obj !== 'object' || obj === null) {
return obj
}
let copy = {}
if(obj.constructor === Array) {
copy = []
}
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
copy[key] = deepClone(obj[key])
}
}
return copy
}
防抖和节流
function debounce(fn,time){
let timer=null
return function(){
clearInterval(timer)
timer=setTimeout(()=>{fn.apply(this,arguments)},time)
}
}
function throttle(fn,time){
let flag=true
return function(){
if(!flag) return
flag=false
setTimeout(()=>{
fn.call(this,arguments)
flag=true
},time)
}
}
实现一个对象的 flatten 方法
const obj = {
a: {
b: 1,
c: 2,
d: {
e: 5
}
},
b: [1, 3, {a: 2, b: 3}],
c: 3
}
flatten(obj)
{
'a.b': 1,
'a.c': 2,
'a.d.e': 5,
'b[0]': 1,
'b[1]': 3,
'b[2].a': 2,
'b[2].b': 3
c: 3
}
function flat(obj,key,res={},isArray=false){
for(let [k,v] of Object.entries(obj)){
if(Array.isArray(v)){
let tmp=isArray?key+'['+k+']'+k:key+k
flat(v,tmp,res,true)
}else if(typeof v==='object'){
let temp=isArray?key+'['+k+']'+'.':key+k+'.'
flat(v,tmp,res,false)
}else{
let tmp=isArray?key+'['+k+']':key+k
res[tmp]=v
}
}
return res
}
实现instanceof
const myInstanceof=function(left,right){
if(typeof left !=='object' || left===null) return false
const proto=Object.getPrototypeOf(left)
while(true){
if(proto===null) return false
if(proto===right.prototype) return true
proto=Object.getPrototypeOf(proto)
}
}
柯里化求值
const sum1=add(1)(2)(3)(4)
console.log(sum1+'');
function add(){
const args=[...arguments]
function fn(){
args.push(...arguments)
return fn
}
fn.toString=function(){
return args.reduce((sum,cur)=>sum+cur)
}
return fn
}
const curry = (fn, arr = []) => {
let len = fn.length;
return function(...args) {
let newArgs = [...arr, ...args]
if(newArgs.length === len) {
return fn(...newArgs)
} else {
return curry(fn, newArgs)
}
}
}
function sum(a,b,c,d,e) {
return a + b + c + d + e
}
let newSum = curry(sum)
const res2=newSum(1)(2)(3,4,5)
用setTimeOut实现setInterval
function mySetInterval(fn, timeout) {
var timer = {
flag: true
};
function interval() {
if (timer.flag) {
fn();
setTimeout(interval, timeout);
}
}
setTimeout(interval, timeout);
return timer;
}
实现jsonp
function jsonp(url, params, callback) {
let queryString = url.indexOf("?") === "-1" ? "?" : "&";
for (var k in params) {
if (params.hasOwnProperty(k)) {
queryString += k + "=" + params[k] + "&";
}
}
let random = Math.random()
.toString()
.replace(".", ""),
callbackName = "myJsonp" + random;
queryString += "callback=" + callbackName;
let scriptNode = document.createElement("script");
scriptNode.src = url + queryString;
window[callbackName] = function() {
callback(...arguments);
document.getElementsByTagName("head")[0].removeChild(scriptNode);
};
document.getElementsByTagName("head")[0].appendChild(scriptNode);
}
手写一个new
function mynew(Func, ...args) {
const obj = {}
obj.__proto__ = Func.prototype
let result = Func.apply(obj, args)
return result instanceof Object ? result : obj
}
实现数字的千分位逗号分割
function thousands(num) {
var result = [], counter = 0;
num = (num || 0).toString().split('');
for (var i = num.length - 1; i >= 0; i--) {
counter++;
result.unshift(num[i]);
if (!(counter % 3) && i != 0) { result.unshift(','); }
}
console.log(result.join(''));
}
thousands(314159265354)