新鲜出炉的蚂蚁一面笔试

2,933 阅读3分钟

前言

渣本3 英语专业 面了2个中厂后(薪资谈不拢) 然后投了 蚂蚁

第二天 收到了一个邮件,来自于蚂蚁的在线笔 --- 探花平台操作 没有代码提示

今天回忆下面试题,希望能帮助到大家

输出打印顺序

这题也没什么难度 关键就 1个 好吧我就记住关键点那个位置的原题了 哈;

有个郁闷的点是 不知道输出顺序/答案写在哪里(晕死 当时找了半天然后 写在题目最后注释处)

最后的答案是 y o u r i g h t 面试官 这个心机boy -.-

setTimeout(() => {
  // 此处忘记啥代码了
}, 0);

setTimeout(() => {
  // 此处忘记啥代码了
}, 0);

function fn() {
  return new Promise(resolve => {
    console.log('y')
    resolve('u')
  })
}

async function func() {
  const p = await fn()
  // 关键点 1: 下面的打印书序 是 先 u 后 r
  Promise.resolve('r').then(res => {
    console.log(res)
  })
  console.log(p) // 
}

func()
console.log('o')

双向绑定

  • 要求:
  1. 页面中有个 input 标签,id为example;
  2. 有个对象test,test.value 与input标签 双向绑定 即 input输入框内容变化,test.value随同变化; test.value变化 input框随同变化 控制台输出变化值 这题不知道考察意图 就按要求实现了 不知道对不对 自己的实现如下 ↓
<html lang="en">
    <head>
    </head>
    <body>
        <input id="example" />
        <script>
            var dom = document.getElementById('example')
            const test = {
              _value: undefined,
              get value() {
                return this._value
              },
              set value(val) {
                this._value = val
                console.log(val)
                dom.value = val
              }
            }
            dom.oninput = function (ev) {
              const { value } = ev.target
              test.value = value
            }
        </script>
    </body>
</html>

实现一个 Promise.all 增强版

  • 要求:
  1. 入参 tasks: any[], runner:(task) => Promise, limit: number
  2. 最大同时执行任务数为limit个
  3. 题目就写了 (一个函数 入参的要求如1 返回参数 return ...) 个人假设返回参数和普通Promise.all一样

说实话 个人Promise的实例方法和静态方法源码都写的很熟了 看到这个 题目要求时候 还是有些蒙的,因为也不知道怎么用,当时想了一段时间有2种思路

  • 将任务tasks 分成limit长度若干数组 分批使用 all 然后 结果 在 flat一下
  • 任务完成一个 重新启用一个任务 递归调用 直到 rejected 任务出现 或 tasks任务均已经执行过了(索引越界)

自己的实现如下 ↓

function all(tasks, runner, limit) {
  return new Promise((resolve, reject) => {
    let isFailed = false // 是否已经 存在 rejected 任务  
    const result = []
    const len = tasks.length
    let n = 0 // fulfilled 个数
    let index = 0 // 任务索引

    while(limit --) { // 执行上线个数的 任务
      fn()
    }

    function fn() {
      if (isFailed) return // 存在 rejected 任务
      if (index >= len) return // 任务队列 索引越界  
      const p = runner(tasks[index])
      const i = index // 重新锁定 闭包变量
      p.then(res => {
        result[i] = res // 此处直接 使用 index 是最外层的index  所以 需要重新在外层定义变量锁定闭包
        n++
        if (len === n) {
          resolve(result)
        } else {
          fn()
        }
      }, err => {
        isFailed = true
        reject(err)
      })
      index++
    }
  })
}
Promise.all = all;

实现 ls -l /usr/xxx/dir

  • 要求:
  1. 获取参数及路径 后 打印出显示内容
  2. 显示内容 包括 文件名称 大小 修改时间
  3. 排序顺序 先 文件夹后文件

这个题目 nodeApi 不熟 最后放弃了 (放弃了不妨在备注里 调侃下 面试官哈。。)

总结

这是小的的 第一篇文章,不知道写出来效果如何 哈~~

希望小伙伴们支持下,后续也好有动力继续更新 谢谢啦·~~

下面是 本人的微信号 webxiaoy 可以一起交流