2022 前端最新面试题2

506 阅读2分钟

1.1rem、1em、1px、1vh各自代表的含义?

  • rem 相对于根元素
  • em 相对于父元素字体大小
  • vh 相当于屏幕宽度和高度的1%
  • px 相对长度单位。像素px是相对于显示器屏幕分辨率而言的

2.display:none和visibility:hidden的区别?

  • display:none是彻底消失,不在文档流中占位,浏览器也不会解析该元素;visibility:hidden是视觉上消失了,可以理解为透明度为0的效果,在文档流中占位,浏览器会解析该元素;
  • 使用visibility:hidden比display:none性能上要好,display:none切换显示时visibility,页面产生回流(当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面重新构建,此时就是回流。所有页面第一次加载时需要产生一次回流),而visibility切换是否显示时则不会引起回流。

3.用原生js写出一段代码,实现一个按钮绑定两个onClick事件?

var btn = document.getElementById('btn')
btn.addEventListener('click', fn1)
btn.addEventListener('click', fn2)

function fn1 () {
  console.log('我是方法1')  
}

function fn2 () {
  console.log('我是方法2')  
}

4.用原生js写出一段代码,实现数组去重?

function unique1(array){
    var n=[];//一个新的临时数组
    for(var i=0;i<array.length;i++){
        //如果当前数组的第i调已经保存进入临时数组,那么跳过
        //否则把当前项push到临时数组里面
        if(n.indexOf(array[i])==-1){
            n.push(array[i]);
        }
    }
    return n;
}

//速度最快,占用空间最多(空间换时间)
function unique2(array){
    var n = {}, r = [], len = array.length, val, type;
    for(var i = 0; i < array.length; i++){
        val = array[i];
        type = typeof val;
        if (!n[val]){
            n[val] = [type];
            r.push(val);
        }else if (n[val].indexOf(type) < 0){
            n[val].push(type);
            r.push(val);
        }
    }
    return r;
}

function unique3(array){
    var n = [array[0]]; //结果数组
    for(var i = 1; i < array.length; i++){
        //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
        //那么表示第i项是重复的,忽略掉。否则结果存入结果数组
        if(array.indexOf(array[i]) == i){
            n.push(array[i]);
        }
    }
    return n;
}

5.GET与POST的区别,何时使用POST?

区别:

  • get是从服务器上获取数据,post是向服务器传送数据。
  • get是将参数数据加到URL中,用户可以看到。post是将内容放置在http请求信息体内传送,用户看不到这个过程。
  • 对于get方法,服务器端是用Request.QueryString获取变量的值,对于post方法,服务器端用Request.Form获取提交的数据。
  • get传送的数据量较小,不能大于2kb。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80kb,IIS5中为100kb。
  • get安全性非常低,post安全性较高。但是执行效率却比post方法好。 何时使用POST:
  • 无法使用缓存文件
  • 向服务器发送大量数据
  • 发送包含未知字符的用户输入时,post比get更稳定也更可靠

6.你所知道的http的响应码以及含义?

1xx(临时响应)

  • 100: 请求者应当继续提出请求。
  • 101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备进行切换。

2xx(成功)

  • 200:正确的请求返回正确的结果
  • 201:表示资源被正确的创建。比如说,我们 POST 用户名、密码正确创建了一个用户就可以返回 201。
  • 202:请求是正确的,但是结果正在处理中,这时候客户端可以通过轮询等机制继续请求。

3xx(已重定向)

  • 300:请求成功,但结果有多种选择。
  • 301:请求成功,但是资源被永久转移。
  • 303:使用 GET 来访问新的地址来获取资源。
  • 304:请求的资源并没有被修改过

4xx(请求错误)

  • 400:请求出现错误,比如请求头不对等。
  • 401:没有提供认证信息。请求的时候没有带上 Token 等。
  • 402:为以后需要所保留的状态码。
  • 403:请求的资源不允许访问。就是说没有权限。
  • 404:请求的内容不存在。

5xx(服务器错误)

  • 500:服务器错误。
  • 501:请求还没有被实现。

7.说一下宏任务和微任务?

  • 宏任务:当前调用栈中执行的代码成为宏任务。 宏任务:I/OsetTimeoutsetIntervalsetImmediaterequestAnimationFrame
  • 微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件 微任务:processnextTickMutationObserverPromise.then 、catchfinally 微信图片_20220226093805.png

8.子组件通过父组件传递参数?

 this.$emit('childFn', this.message);

9.v-if与v-show指令有哪些相同点和不同点?

相同点:

  • v-show和v-if都能控制元素的显示和隐藏。 不同点:
  • v-show本质就是通过设置css中的display设置为none,控制隐藏;v-if是动态的向DOM树内添加或者删除DOM元素
  • v-show都会编译,初始值为false,只是将display设为none,但它也编译了;v-if初始值为false,就不会编译了
  • v-show只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,故v-show性能更好一 使用场景:
  • 频繁切换某节点时,使用v-show(无论true或者false初始都会进行渲染,此后通过css来控制显示隐藏,因此切换开销比较小,初始开销较大)
  • 如果不需要频繁切换某节点时,使用v-if(因为懒加载,初始为false时,不会渲染,但是因为它是通过添加和删除dom元素来控制显示和隐藏的,因此初始渲染开销较小,切换开销比较大)

10.父组件向子组件传递数据?

props

11.v-model的使用?

<input type="text" v-model="msg">

12.$nextTick的使用?

  • this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

13.computed与watch的区别?

微信图片_20220226094432.png

14.职业规划?

15.css 水平、垂直居中的方法,至少写3种?

方法一
div{
      width: 300px;
      height: 300px;
      position: relative;
      border: 1px solid #465468;
 }
 img{
      position: absolute;
      margin: auto;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
 }

方法二
.container{
      width: 500px;
      height: 400px;
      border: 2px solid #379;
      position: relative;
 }
 .inner{
      width: 480px;
      height: 380px;
      background-color: #746;
      position: absolute;
      top: 50%;
      left: 50%;
      margin-top: -190px; /*height的一半*/
      margin-left: -240px; /*width的一半*/
 }
方法三
div{
	width: 260px;
	height: 230px;
	border: 3px solid #555;
	display: table-cell;
	vertical-align: middle;
	text-align: center;
}
img{
	vertical-align: middle;
}

16.用js的递归的方法计算1-100求和?

方法一
function add(num, start) {
    num += start
    start++;
    if (start > 100) {
        console.log(num);
        return num
    }
    else {
        add(num, start)
    }
}
add(0, 1);

方法二
function add(n) {
    if(n == 1) return 1;

    return add(n-1) + n
  }
  let total = add(100)

17.说一下闭包?

  • 就是在函数里面声明函数,实际开发中主要应用于封装变量保护变量不受外界污染,也相当于是在函数作用域里面再声明一个内部作用域,这样执行结果拿到的变量都是不同的,拿的就不是全局变量

18.说一下常用的es6的功能?

blog.csdn.net/lovoo/artic…

19.vue.js的优点?

  • 轻量级的框架
  • 双向数据绑定
  • 指令
  • 插件化

20.请列举至少5种可以从Dom获取元素的方法?

  1. 通过ID获取(getElementById)
  2. 通过name属性(getElementsByName)
  3. 通过标签名(getElementsByTagName)
  4. 通过类名(getElementsByClassName)
  5. 获取html的方法(document.documentElement)
  6. 获取body的方法(document.body)
  7. 通过选择器获取一个元素(querySelector)
  8. 通过选择器获取一组元素(querySelectorAll)

21.请从web开发的角度,阐述如何对web页面进行性能优化?

blog.csdn.net/weixin_4427…

22.解释一下vue.js单向数据流和双向数据绑定之间的区别?

blog.csdn.net/Bonjourjw/a…