文章目录  
 实现一个函数去重? 实现一个函数,判断指定元素在数组中是否存在? 实现一个函数,将给定字符串反转? 实现一个函数,检测指定字符串是否为回文(即从前往后和从后往前的字符序列都相同)? 实现一个函数,计算两个数的最大公约数? 实现Array.prototype.reduce函数 实现 一个类似setTimeout的函数delay(ms) 实现一个防抖函数debounce(fn, delayTime) 实现一个节流函数throttle(fn, intervalTime) 实现一个深度拷贝函数deepClone(obj)   
 
function  unique ( array )  { 
  return  Array. from ( new  Set ( array) ) ; 
} 
function  includes ( array,  value )  { 
  for  ( let  i =  0 ,  len =  array. length;  i <  len;  i++ )  { 
    if  ( array[ i]  ===  value)  { 
      return  true ; 
    } 
  } 
  return  false ; 
} 
function  reverseString ( str )  { 
  
  const  arr =  str. split ( '' ) ; 
  
  arr. reverse ( ) ; 
  
  return  arr. join ( '' ) ; 
} 
function  isPalindrome ( str )  { 
  
  return  reverseString ( str)  ===  str; 
} 
function  reverseString ( str )  { 
  return  str. split ( '' ) . reverse ( ) . join ( '' ) ; 
} 
function  gcd ( num1,  num2 )  { 
  return  num2 ?  gcd ( num2,  num1 %  num2)  :  num1; 
} 
Array . prototype. myReduce  =  function ( fn,  initialValue )  { 
  let  accum =  initialValue ===  undefined  ?  undefined  :  initialValue; 
  for  ( let  i =  0 ;  i <  this . length;  i++ )  { 
    if  ( accum !==  undefined )  { 
      accum =  fn . call ( undefined ,  accum,  this [ i] ,  i,  this ) ; 
    }  else  { 
      accum =  this [ i] ; 
    } 
  } 
  return  accum; 
} ; 
function  delay ( ms )  { 
  return  new  Promise ( ( resolve )  =>  setTimeout ( resolve,  ms) ) ; 
} 
function  debounce ( fn,  delayTime )  { 
  let  timerId; 
  return  function ( )  { 
    const  context =  this ; 
    const  args =  arguments; 
    clearTimeout ( timerId) ; 
    timerId =  setTimeout ( ( )  =>  { 
      fn . apply ( context,  args) ; 
    } ,  delayTime) ; 
  } ; 
} 
function  throttle ( fn,  intervalTime )  { 
  let  timerId; 
  let  canRun =  true ; 
  return  function ( )  { 
    const  context =  this ; 
    const  args =  arguments; 
    if  ( ! canRun)  return ; 
    canRun =  false ; 
    timerId =  setTimeout ( function ( )  { 
      fn . apply ( context,  args) ; 
      canRun =  true ; 
    } ,  intervalTime) ; 
  } ; 
} 
function  deepClone ( obj )  { 
  if  ( typeof  obj !==  'object'  ||  obj ===  null )  { 
    return  obj; 
  } 
  let  result =  Array. isArray ( obj)  ?  [ ]  :  { } ; 
  for  ( let  key in  obj)  { 
    if  ( obj. hasOwnProperty ( key) )  { 
      result[ key]  =  deepClone ( obj[ key] ) ; 
    } 
  } 
  return  result; 
}