美团面试总结

本文总结了美团面试中涉及的前端知识点,包括HTML5新标签、块元素与内联元素的区别、CSS的display:inline-block间隙解决方案、响应式设计、flex布局、JavaScript数据类型、事件委托、闭包、深克隆与浅克隆、ES6特性、Promise工作原理以及跨域问题等。此外,还讨论了前端优化策略和编辑器插件的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTML5中的一些新标签?

关于HTML5可能我用到的还是相对比较少,所以我就说了一些我常用的新标签:header,footer,audio,video,nav,关于这些,可以参考这里

块元素和内联元素的区别

块元素:独占一行,可以设置width,height属性,可以设置margin和padding

内联元素:不会独占一行,设置width和height无效,水平方向上的margin和padding有效

块元素包括:address、blockquote、center、dir、div、form、h1-h6、hr、ol、ul、table、header、footer、nav等

内联元素包括:a、img、span、em、i、input、select、sup、sub、button

当然元素我也只是说了一部分,然后我说,通过改变display属性可以进行改变,所以就有下面的问题了

display:inline-block存在间隙,如何解决

以ul中li的为例:

方法一:ul {font-size:0} ul li {font-size: 1.2rem}
方法二:将li的开始与结束标签不写在同一行

方法三:li不闭合

方法四:设置负边距 ul li+li{margin-left:-3px}

响应式的实例

关于响应式这边,单位用em或者rem,媒体查询,响应式图片picture的使用

flex布局

Flex 容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称”项目”

flex 父元素宽度为200,子元素宽度分别为30,40,50,呈现一个怎样的情况?当时我被问到的是这个题目,现在想了一下,当时的我没有将题目听清楚,当时所说到的flex1,flex2,flex3应该就是类选择器(被自己蠢到了,当时误以为是flex : 1),虽然说flex我确实用的也少,但是当时我想的是我没这样用过的呀,然后就猜着回答了,教训就是题目没听清的时候,不要瞎猜

下面的都是我自己的尝试:

只是给三个子div设置position:flex; 30是在父元素中的,40,50在父标签的下一行点此查看效果

在上面的基础上,给子标签添加display:inline-block属性,点此查看效果

JS中的数据类型?

基本类型和复杂类型:

基本类型:Undefined, Null, Boolean, String, Number

复杂类型:数组,对象,函数

事件委托是什么?事件冒泡?为什么要使用事件委托?什么情况下阻止事件冒泡?

事件委托避免了为多个元素添加同一事件监听,而是将这种事件的监听放在父元素上,这个我当时说的时候是以ul与li为例的。事件委托的好处:减少了事件的注册,节省内存;简化了dom节点更新时,相应事件的更新

事件冒泡就是,当事件触发时,会一层一层向上冒,直到顶层

阻止冒泡:父级元素和子元素都有事件的时候,需要阻止向上冒泡

给了一段代码,让我说运行结果,三种情况下的?

var a = 1;

function func () {
  var a = 2;
  return function () {
    console.log(a);  
  }
}

console.log(func());
console.log(func()());  

执行func()的时候,会返回一个函数,再执行的时候,会输出a的值,在返回的这个函数中产生了闭包,它保持着对a的引用,所以是2

function () {

​ console.log(a);

}

2

var a = 1;

function func () {
  var a = 2;
  return function () {
    console.log(this.a); 
  }
}
func()();

执行返回的这个函数的时候,this指代的是window,所以是1

1

var a = 1;

function func () {
  var a = 2;
  return function () {
    console.log(this.a); 
    console.log(a);
  }
}

var obj = {a: 3};
func().call(obj);   

利用call改变了this的指向,所以输出的是obj中的a为3, 第二个是因为闭包,所以输出的是2

3 2

将一个数组的第四个元素放在第一个和第二个元素之间,splice返回值是什么?

var ary = [12, 34, 45, 56, 67];
var n = ary.splice(3, 1);
ary.splice(1, 0, n.pop());
console.log(ary);  // [12, 56, 34, 45, 67]

splice返回值是一个数组,写代码这种事情,就是先有思路,再动手,写一步,就要确保这一步的结果是你想要的,不要一下写了一大串,错了好多

深克隆与浅克隆原理讲解,代码?

浅克隆就是对于对象,只是引用,而没有真正做到“克隆”,深克隆就需要保证原来有的东西,现在新产生的就得有

Object.prototype.clone = function() {
  var newObj = {};
  for(var item in this) {
    newObj[item] = this[item];
  }
  return newObj;
}

浅克隆做到的就是引用

Object.prototype.clone = function() {
  var newObj = {};
  for(var item in this) {
    if(typeof this[item] == 'object' || typeof this[item] == 'function') {
      newObj[item] = this[item].clone(); 
    }else {
      newObj[item] = this[item];
    }
  }
  return newObj;
}

Array.prototype.clone = function() {
  var newObj = [];
  for(var item = 0; item < this.length; item++) {
    if(typeof this[item] == 'object' || typeof this[item] == 'function') {
      newObj[item] = this[item].clone();
    }else {
      newObj[item] = this[item];
    }
  }
  return newObj;
}

Function.prototype.clone = function() {
  var that = this;
  var newFunction = function() {
    return that.call(this, arguments);
  }
  for(var item in this) {
    newFunction[item] = this[item];
  }
  return newFunction;
}

上面的是我之前写过的,面试官让我实现的是一个函数,完成深克隆,而且要求我不给原型上加,并且也可以对简单类型进行处理,代码如下:

function clone(obj) {
  if(Array.isArray(obj)) {
    var ary = [];
    for(var i = 0; i < obj.length; i++) {
      if(typeof obj[i] == 'object' || typeof obj[i] == 'function') {
        ary.push(clone(obj[i]));
      }else {
        ary.push(obj[i]);
      }
    }

    return ary;

  }else if(typeof obj == 'object') {
    var o = {};

    for(var item in obj) {
      if(typeof obj[item] == 'object' || typeof obj[item] == 'function') {
        o[item] = clone(obj[item]);
      }else {
        o[item] = obj[item];
      }
    }

    return o;
  }else if(typeof obj == 'function') {
    var fun = new Function();

    for(var item in obj) {
      if(typeof obj[item] == 'object') {
        fun[item] = clone(obj[item]);
      }else {
        fun[item] = obj[item];
      }
    }

    return fun;
  }else {
    return obj;
  }
}

测试代码:

console.log(clone(12));

var obj = {
name : 'obj',
likes : ['js'],
display : function() {
console.log(this.name); 
}
};

var newObj = clone(obj);
newObj.likes.push('css');
console.log(newObj.likes);
console.log(newObj.display == obj.display); 

面试官问了我关于function的处理,这样处理我是考虑到了原型对象

ES6我都了解什么?

箭头函数,promise,这两个应该算我比较熟悉的吧,一个是学Vue常用的,一个是我专门看过的Promise,其他的不敢说自己知道多少,只能说是听说

箭头函数和普通函数的区别

区别就关键在于this指的是什么,普通函数而言,谁调用的,this就指向谁,this可以看作是一个动态作用域的东西,而箭头函数中的this跟定义它的有关系,也就是词法作用域层次的

promise,多层then形成一个链,为什么可以多次调用then,then函数里的两个函数是什么,包含return语句的resolve函数返回的是什么,如果return的是Promise对象呢?

因为每次调用then之后,都会返回一个新的Promise对象,then函数里面的两个函数是resolve和reject,包含return语句的resolve函数返回的是一个把返回的东西包装成的一个Promise对象,这个对象中的[[promiseValue]]指的就是返回的东西,return的是promise对象的话,我想,返回的依旧是一个promise对象,这个对象的[[promiseValue]]就是return的promise对象

跨域问题的解决办法?jsonp服务器端返回的是什么?

首先跨域,协议不同,域名不同,端口不同,满足其一就是跨域,解决跨域的方法有,jsonp,jsonp服务器端返回的是什么?当时我答成了数据,面试官告诉我,返回的是其实是一个函数,后来想来一下是的,返回的就是js代码,调用你回调函数的js代码。之后面试官又问了我还有哪些,我就说了一下domain这个东西,其他的了解的不多,点击这里查看更多

http请求头有哪几种?

这个问题我当时只是回答了一下,请求头里面的字段,Cookie,Host等,之后查了一下,与content-type有关系,参考这里

使用过cookie吗?在前端操作的还是在后台操作的?

使用cookie之前存储过用户账号,在前端操作的,后台也是可以操作cookie的,cookie每次都会随着请求发送给后台

模块化了解吗?优点和弊端?

require进行引用其他模块,模块化是一种将系统分离成独立功能部分的方法,可将系统分割成独立的功能部分,严格定义模块接口、模块间具有透明性

优点:可维护性和可测试性

1)可维护性

  • 灵活架构,焦点分离
  • 方便模块间组合、分解
  • 方便单个模块功能调试、升级
  • 多人协作互不干扰

2)可测试性 可进行单元测试

缺点:性能损耗

  • 系统分层,调用链会很长
  • 模块间通信,模块间发送消息会很耗性能

当时忘记说,在使用vue-cli的时候,已经使用了import和export

前端怎样优化?

减少DOM操作,减少HTTP请求(雪碧图),对代码进行压缩,CDN服务,算法的优化,语义化(高效使用HTML标签和CSS样式)

使用过哪些编辑器?sublime我都装过哪些插件?

sublime,HBuilder,webStorm,sublime安装的插件名字还真是有些忘记,EmmetJSFormatjQueryNodejs

这场面试持续了一个多小时,感觉问的还是很全面的,面试官还说了我代码写的不错,嘻嘻,开心,继续努力吧,后面因为时间的原因,没有办法…,但是还是很谢谢面试官,努力啦…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值