前端手撕代码面试题

1.手写flat 方法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 准备一个数组
const arr = [[9], [8, [9]], [7, [99, [7, [12, [1], [33]]]]], 1, [2, [3, [4, [5]]]]];

//  arr.flat(Infinity)   Infinity 表示扁平化任意深度

// 第二种方法
function flat(arr) {
    return arr.reduce((acc,cur)=> acc.concat(Array.isArray(cur)? flat(cur) :cur),[])
}
const newArr = flat(arr)
console.log(newArr)
  </script>
</body>
</html>

第一种方法: arr.flat(Infinity)   Infinity 表示扁平化任意深度

第二种方法: 利用reduce累加器  自己调用自己

2.polyfill

(1) 手写filter polyfill

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    //1.准备一个数组
    const arr = [1,3,5,7,9]
    //2.往原型上挂载
    Array.prototype.filter2 = function(callback) {
      //3.准备一个空数组接数据
      const newArr = []
      //4.遍历
      for(let i =0; i<this.length; i++) {
        /* const res = callback(this[i],this)
        if(res){
          newArr.push(this[i])
        } */
        callback(this[i],i,this) && newArr.push(this[i])
        //callback 参数 this[i] 代表每一项
        //callback 参数 i 代表数组下标
        //callback 参数 this 代表数组
      }
      return newArr 
    }
    const res = arr.filter2((item,index,originArr)=> {
      // 当这个函数的返回值为true的时候,保留item到新数组
      return item>=5
    })
    console.log(res)
  </script>
</body>
</html>

(2) 手写forEach polyfill

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    //1.准备数组
    const arr = ['胡歌','王凯','朱亚文']
    //2.往原型上挂载
    Array.prototype.forEach2 = function(callback,_this=window) {
      for(let i = 0; i<this.length ; i++) {
        callback.call(_this,this[i], i, this)
      }
    }
    arr.forEach2(function (item,index,originArr) {
      console.log(item,index,originArr,this);
    })
  </script>
</body>
</html>

后续会持续更新......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 实现一个数组去重的函数 思路:使用对象来存储数组中的元素,遍历数组,若元素在对象中不存在,则存储到对象中,并将其推入新数组中。 2. 实现一个函数,判断一个字符串是否是回文字符串 思路:将字符串翻转,与原字符串比较是否相等。 3. 实现一个函数,可以将多维数组转化为一维数组 思路:使用递归来遍历多维数组,将每个元素推入新数组中,直到遍历完所有元素。 4. 实现一个函数,统计一个字符串中出现次数最多的字符 思路:使用对象来存储每个字符出现的次数,遍历字符串,将每个字符存储到对象中,找到出现次数最多的字符。 5. 实现一个函数,实现数组的冒泡排序 思路:使用双重循环遍历数组,比较相邻两个元素的大小,如果前者大于后者,则交换两个元素的位置,直到遍历完数组。 6. 实现一个函数,实现数组的快速排序 思路:选择数组中的一个元素作为基准点,将数组分为两个部分,一部分大于基准点,一部分小于基准点,递归处理两个部分。 7. 实现一个函数,实现数组的深拷贝 思路:使用递归遍历数组中的每个元素,判断元素类型,如果是对象或数组,则进行深拷贝,如果是基本类型,则直接复制。 8. 实现一个函数,实现函数的柯里化 思路:使用闭包保存参数,当参数个数达到预设值时,执行函数。 9. 实现一个函数,实现函数的节流 思路:使用定时器来控制函数执行的频率,每次函数执行时,清除定时器并重新设置一个定时器。 10. 实现一个函数,实现函数的防抖 思路:使用定时器来延迟函数执行,每次函数执行时,清除定时器并重新设置一个定时器。如果在定时器延迟时间内再次触发函数,则重新计时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金凯枫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值