美团前端暑期实习一面凉经

294 阅读3分钟

面试官小姐姐声音很好听,很温柔,问的问题也不难,但就是答不上,脑袋晕晕的,大脑一片空白。

  • 项目
  • CSS
  • JS
  • 算法题

1. 项目

前端权限控制

项目介绍时说做了前端权限控制,然后就问怎么做的权限控制。(回答了为什么用基于角色的权限控制)

前端优化

提到做了一些前端优化(CDN,组件拆分按需加载,第三方组件按需引入),讲了为什么用CDN,好处;组件懒加载(没答上来),第三方组件按需引入(讲到用了Echarts的雷达图来展示员工的能力,巴拉巴拉说了一些,不光是引入了radar,还引入了提示框和标题组件); 追问怎么看JS大小占比的,回答用的Vue-CLI,用的什么命令,还记得显示分析页面资源占比的页面里面有些什么东西吗,左边显示的有些什么,里面会显示静态资源占比吗(当时都答了些啥啊。。。)。

Vue-CLI打包文件大小分析:npm run preview -- --report

image.png

2. CSS

flex实现九宫格

 <!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>
   <style>
     /* 清楚默认样式 */
     * {
       margin: 0;
       padding: 0;
     }
     /* 正方形九宫格 */
     .box {
       width: 600px;
       height: 600px;
       display: flex;
       flex-wrap: wrap; // 关键属性
     }
 ​
 ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/14e75f27b1ef43fd92da91a06ca82c40~tplv-k3u1fbpfcp-watermark.image?)
     .box div {
       background-color: red;
       width: 33%;
       height: 33%;
       margin: 1px;
     }
 ​
 ​
   </style>
 </head>
 <body>
   <div class="box">
     <div>1</div>
     <div>2</div>
     <div>3</div>
     <div>4</div>
     <div>5</div>
     <div>6</div>
     <div>7</div>
     <div>8</div>
     <div>9</div>
   </div>
 </body>
 </html>

3. JS

  1. var, let和const的区别;

  2. 事件执行机制;

    • 追问宏任务和微任务有哪些;
  3. 作用域和作用域链;

  4. 看代码说输出(两个题都是this指向问题)

 const name="global";
 var obj = {
     name: '123',
    getName:() =>{
         console.log(this.name);
   }
 }
 ​
 obj.getName();
 ​
 ​
 ​
 /**输出
  * undefined
  */

JS执行环境分为浏览器环境(V8)和Node.js执行环境。

 /* 分析过程 */
 var obj = {
   name: '123',
   getName: () => {
     console.log(this);
   }
 }
 ​
 obj.getName();

在V8中,输出为Windos对象,说明字面量定义的对象obj的箭头函数getName的this并不是指向obj的。如果箭头函数改为普通函数,则getName的this执行obj。为什么getName是箭头函数时,this没有指向obj而是指向Window?因为用对象字面量方法所创建的对象,执行上下文是位于全局中。

这里要明确普通函数和箭头函数this指向的差异。普通函数的this指向调用该函数的上下文对象,箭头函数的this指向定义该函数的上下文对象。怎么理解这两句话?看下面这段代码:

 function King() {
     this.royaltyName = "Henry";
     // 箭头函数的this指向King,因为这个箭头函数在King里面定义的;
     setTimeout(() => { console.log(this.royaltyName) }, 1000);
 }
 ​
 function Queen() {
     this.royaltyName = "Elizabeth";
     // this指向Window对象,因为W 
     setTimeout(function() { console.log(this.royaltyName) }, 1000);
 }
 ​
 new King();
 new Queen();
 ​
 /**
  * Henry
  * undefined
  */

这道题在V8和Node.js中执行结果有差异,因为两者的全局对象不一样。

V8的全局对象是window,Node.js的全局对象是global,但注意global并不是Node.js环境中最外层的全局对象,最外层是module.exports。

 var name = '123';
 ​
 var obj = {
     name: '456',
     getName: function () {
         function printName () {
             console.log(this.name);
         }
 ​
         window.printName();
     }
 }
 obj.getName();
 ​
 ​
 /**输出
  * window.printName is not a function(浏览器环境)
  * Cannot read property 'getName' of undefined(Node环境)
  */

4.算法题

 // 二叉树深度优先遍历(非递归)
      8
  1       6
 5,3         7
 ​
 ​
 1. 定义二叉树节点(×)
 2. 循环构建二叉树(×)
 3. 迭代遍历
 ​
 不需要构建二叉树!!!直接写迭代遍历的逻辑,昏搓搓的。
 ​

\