面试重点

134 阅读2分钟

1.css

屏幕快照 2021-05-16 21.05.52.png

1.1标签语义化,都有什么标签,有哪些区别,如何转化,display还有哪些,

合理的标签干合理的事情。

有块状标签(div,p,h1-h6,ul li,header,footer,nav,section,artical)和行内标签(em ,i,span,small,strong, )行内块状标签(img,input,表单元素标签)。

块状标签能独占一行,可以设置宽高,行内标签不能独占一行,不能设置宽高,行内块状标签同时具备块状标签和行内标签的特点。

display:inline-block;display:block;

2.css面试题

屏幕快照 2021-05-16 21.30.23.png

屏幕快照 2021-05-16 22.13.33.png

屏幕快照 2021-05-16 22.16.27.png 第二种方式渲染性能比较高,因为css渲染机制是从右向左渲染。

脱离文档流方式:float浮动、position:定位、transform、anmiate

2. js

屏幕快照 2021-05-16 22.23.36.png

屏幕快照 2021-05-16 22.24.22.png

2.1 js四大类型检测方法

typeof instanceof constructor Object.prototype.toString.call()

2.2

屏幕快照 2021-05-16 22.34.01.png 堆:存储引用类型的空间 栈:存储基本类型值和指定代码的环境

屏幕快照 2021-05-16 22.54.56.png

e1.培训(对象和数组的区别) e2.珠峰 (自己实现一个symbol) e3:培训(Object.prototype.toString/valueOf)

e3对象会调用toString方法,转化为[object,object] 字符串 后面会把前面覆盖掉

2.3

屏幕快照 2021-05-16 23.03.54.png

屏幕快照 2021-05-16 23.18.01.png

2.4

屏幕快照 2021-05-16 23.20.15.png

'1' '4'

2.5 对象(数组)的深克隆和浅克隆(头条)

屏幕快照 2021-05-16 23.38.10.png

深克隆

JSON.parse(JSON.stringify(obj))(fun函数和正则以及日期除外)

JSON.stringify() 处理中会将fun函数和正则以及日期进行字符串转化,有问题

解决方法:递归

 function deepClone(obj){
 //过滤特殊情况 (null 也是object)
  if(obj === null) return null;
  if(typeOf obj !=='object') return obj;
  if(obj instanceOf RegExp){
      return new RegExp(obj);
  }
  if(obj instanceOf Date){
      return new Date(obj);
  }
 
   //不直接创建空对象目的:克隆的结果和之前保持相同的所属类(obj.constructor)
     let newObj =new obj.constructor;
     for(let key in obj){
         if(Obj.hasOwnProperly(key)){
             newObj[key] = deepClone(obj[key]); //obj[key]如果是一个对象
         }
     }
     return newObj;
 }

2.6

屏幕快照 2021-05-17 00.08.23.png

屏幕快照 2021-05-17 00.09.05.png

2 4 1 1 2 3 3

2.7 同步异步

屏幕快照 2021-05-17 00.32.33.png

屏幕快照 2021-05-17 00.45.45.png

2.8

image.png

2.9

image.png

image.png

2.10 vue 2.0 和 vue3.0 双向数据绑定实现原理

vue 2.0 image.png

image.png

vue 3.0

image.png

image.png

3 算法

3.1数组去重

es6 SET模式 (new Set(ary)返回的是实例)

let ary=[12,23,34,45,23]
let arr =Array.from(new Set(ary));
或用es6扩展运算符
let arr =[...(new Set(ary)];

通过创建一个新数组(第一项和数组里面的所有项进行对比,没有的话就push进新数组,应该为arr.length)

 let arr=[];
 for(let i=0;i<ary.length;i++){
     let item = ary[i];
     args = ary.slice(i+1);
     if(args.indexOf(item)>-1){
     //存在这个值
     }else{
         arr.push(item);
     }
 }

屏幕快照 2021-05-17 21.47.02.png

通过操作当前数组,存在的值赋值为null,然后再经过过滤得到不为null的值

 for(let i=0;i<ary.length-1;i++){
     let item = ary[i];
     args = ary.slice(i+1);
     if(args.indexOf(item)>-1){
     //存在这个值
      arr[i] =null;
     }
 }
 ary =ary.filter(item=>item !==null)

对象健值对 拿数组中的每一项向新容器中存储,如果已经存储过,就把这项干掉

let obj={};
for(let i=0;i<ary.length;i++){
     let item = ary[i];
     if(typeof obj[item] !=='undefind'){
          ary[i] =ary[ary.length-1];
          ary.length --;
          i--;
          continue;
     }
     obj[item]= item;
 }
 obj =null;

3.2数组排序

屏幕快照 2021-05-17 22.17.40.png

屏幕快照 2021-05-17 22.32.13.png

屏幕快照 2021-05-17 22.32.46.png

屏幕快照 2021-05-17 22.33.20.png

屏幕快照 2021-05-17 22.34.09.png

3.2数组扁平化

  1. es6 的flat直接扁平化flat(Infinity)

屏幕快照 2021-05-17 22.47.41.png

屏幕快照 2021-05-17 22.48.15.png