「一週一個大廠」覆盤一下 拼多多 的面經,發現不足,逐一擊破!

Sunshine_Lin發表於2021-12-27

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心

一週一個大廠 是我新出的一個系列文章,大概的流程是這樣的:

1639711909(1).png

  • 我會收集一些大廠的面經,並試著去回答
  • 如果全都會則等待下一週重新一輪
  • 如果有不會的,則記錄下來,並去克服它們,寫成文章,然後下一輪

這個系列的目的就是:逼自己學習,寫文章鞏固新知識,且複習舊知識

拼多多

今天是 一週一個大廠 的第二期,今天我們們來複盤一下拼多多的面經,發現不足,並逐一擊破他們吧!

一面

1、簡歷專案問詢 - 細節

略。。。。。

2、垂直水平居中

  • 1、position: absolute + left: 50% + top: 50% + transform: translate(-50%, -50%)
  • 2、display: flex + justify-content: center + align-items: center
  • 3、display: table-cell + text-align: center + vertical-align: middle

    3、一個簡單請求的header會有什麼欄位

  • Accept :瀏覽器支援的MIME型別
  • Accept-Encoding:gzip, deflate :瀏覽器支援的壓縮編碼是gzip和deflate
  • Accept-Language:zh-cn,zh;q=0.5 :瀏覽器支援的語言是簡體中文和中文,優先支援前者
  • Connection:keep-alive :客戶端與服務端的連線型別為持久連線
  • Content-length :內容長度
  • Content-type :內容格式
  • Host :域名
  • Origin :訪問來源地址(protocal + host)
  • Referer :訪問來源地址(完整)

    4、map、filter、reduce 都怎麼用?

    可以看我的文章基礎很好?總結了38個ES6-ES12的開發技巧,倒要看看你能拿幾分?? 裡面的 map、filter、reduce 部分

    5、Symbol有了解過過嗎?

    可以看我的文章基礎很好?總結了38個ES6-ES12的開發技巧,倒要看看你能拿幾分?? 裡面的 Symbol 部分

    6、ES5繼承、ES6類繼承,靜態方法?

  • ES5繼承:工作中遇到的50個JavaScript的基礎知識點 裡的 繼承方式
  • ES6類繼承:基礎很好?總結了38個ES6-ES12的開發技巧,倒要看看你能拿幾分?? 裡的 Class

    7、Promise 超時控制?

    利用 Promise.all

    const request = (delay) => (
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('資料')
      }, delay)
    })
    )
    
    const time = (delay) => (
    new Promise((resolve, rejct) => {
      setTimeout(() => {
        resolve('超時啦!')
      }, delay)
    })
    )
    
    const getData = (delay1, delay2) => (
    Promise.race([request(delay1), time(delay2)])
    )
    
    // 不超時情況
    getData(1000, 2000).then(res => console.log(res))
    // 超時情況
    getData(2000, 1000).then(res => console.log(res))

    8、DFS 找節點

    function depthFirstSearchNoRecursion (target) {
      const res = [];
      const stack = target.slice();
      // console.log(stack)
      while (stack.length > 0) {
          const node = stack.shift(); // 最上層節點出棧
          res.push(node.id);
          // 如果該節點有子節點,將子節點存入棧中,繼續下一次迴圈
          const len = node.children && node.children.length;
          for (let i = len - 1; i >= 0; i--) {
              stack.unshift(node.children[i]);
          }
      }
      return res;
    }

    9、Node有什麼特性,適合用來做什麼?

    特性

  • 1、 它是一個Javascript執行環境
  • 2、 依賴於Chrome V8引擎進行程式碼解釋
  • 3、 事件驅動
  • 4、 非阻塞I/O
  • 5、 輕量、可伸縮,適於實時資料互動應用
  • 6、 單程式,單執行緒

    場景

  • 1、 高併發(最重要的優點)
  • 2、 適合I/O密集型應用

10、midway對比egg有什麼優勢?

據我所知就是對 typescript 的支援非常好

11、typescript 有沒有實踐過?

實踐過:

二面

1、壓力面,質疑觀點?

2、拍平陣列

要求

const flatten = (list, level = +Infinity) => {
  // ...
};
const array = [1, [2, [3, 4, [5]], 3], -4];
const list1 = flatten(array);
const list2 = flatten(array, 2);
console.log(list1); // [1, 2, 3, 4, 5, 3, -4]
console.log(list2); // [1, 2, 3, -4]

解題

const flatten = (list, level = +Infinity) => {
  let res = list
  for (let i = 0; i < level; i++) {
    res = [].concat(...res)
    if (!res.some(item => Array.isArray(item))) break
  }
  return res
};

3、Promise

要求

const myPromise = val => Promise.resolve(val);
const delay = duration => {
  // ...
};
myPromise(`hello`)
  .then(delay(1000))
  .then(val => console.log(val)); // 一秒之後輸出 hello

解題

const delay = duration => {
  return (val) => (
    new Promise((resolve, reject) => {
      setTimeout(() => resolve(val), duration)
    })
  )
};

三面

1、專案細節詢問

略。。。

2、Vue 原始碼有讀嗎 - 響應式原理,nextTick

可以看我的Vue原始碼解析專欄

3、最近有沒有研究什麼新技術?

唱跳rap

4、專案優化有哪些實踐?

略。。。根據自己專案回答這幾方面:

  • 1、業務方面優化
  • 2、請求方面優化
  • 3、打包方面優化
  • 4、架構方面優化

    5、V8 如何執行一段程式碼?

  • 第一步: Parser 將程式碼轉轉 AST(抽象語法樹)
  • 第二步: 直譯器Ignition 生成位元組碼
  • 第三步:執行

    6、72-編輯距離

    不會。。已收集到大廠演算法題中

    7、226-翻轉二叉樹

    不會。。已收集到大廠演算法題中

    8、效能優化的實踐?

    略。。。根據自己專案回答。。

    9、有其他想問的嗎?

    我帥嗎

結語

我是林三心,一個熱心的前端菜鳥程式設計師。如果你上進,喜歡前端,想學習前端,那我們們可以交朋友,一起摸魚哈哈,摸魚群,加我請備註【思否】

image.png

相關文章