A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 逆风TO 于 2019-12-5 11:08 编辑

1、手写数组去重,多种方法

使用ES6的Set去重(Set是ES6新增的数据类型,Set 的成员具有唯一性)
function distinct(arr) {
  return Array.from(new Set(arr));
}     

使用ES6的Set去重(超级简化版)
[...new Set(arr)]   // [...new Set(需要去重的数组)]
使用splice配合两重for循环去重
function distinct(arr) {
  for(let i = 0; i < arr.length; i++) {
      for(let j = i + 1; j < arr.length; j++) {
          if(arr === arr[j]) {
              arr.splice(j, 1);
              j--;
          }
      }
  }
  return arr;
}

使用for循环配合indexOf去重
function distinct(arr) {
     let newArr = [];
     for(let i = 0; i < arr.length; i++) {
         if(newArr.indexOf(arr) === -1) {
             newArr.push(arr);
         }
     }
     return newArr;
}

使用for循环配合sort排序去重
function distinct(arr) {
      arr = arr.sort();
      let newArr = [];
      for(let i = 0; i < arr.length; i++) {
          if(arr !== arr[i-1]) {
              newArr.push(arr);
          }
      }
      return newArr;
  }

使用for循环配合includes去重
  function distinct(arr) {
      let newArr = [];
      for(let i = 0; i < arr.length; i++) {
          if(!newArr.includes(arr)) {
              newArr.push(arr);
          }
      }
      return newArr;
}

使用filter配合indexOf去重
function distinct(arr) {
      return arr.filter((item,index, arr) =>
       arr.indexOf(item) === index);
}

2、浏览器是如何渲染页面的

根据html文件构建DOM树和CSSOM树。构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕,再继续构建DOM树及CSSOM树
构建渲染树(Render Tree)构建渲染树,根据渲染树计算每个可见元素的布局,并输出到绘制流程,将像素渲染到屏幕上(渲染树(Render Tree)由DOM树、CSSOM树合并而成,但并不是必须等DOM树及CSSOM树加载完成后才开始合并构建渲染树。三者的构建并无先后条件,亦非完全独立,而是会有交叉,并行构建。因此会形成一边加载,一边解析,一边渲染的工作现象)
页面的重绘(repaint)与重排(reflow,也有称回流)页面渲染完成后,若JS操作了DOM节点,根据JS对DOM操作动作的大小,浏览器对页面进行重绘或是重排。
基本原理:

浏览器内核拿到内容后,渲染步骤大致可以分为以下几步
解析HTML,构建DOM树
解析CSS,生成CSS规则树
合并DOM树和CSS规则,生成render树(DOM树和CSSOM树连接在一起形成render tree .‘渲染数’)
布局render树(Layout/reflow),负责各元素尺寸、位置的计算
绘制render树(paint),绘制页面像素信息
浏览器会将各层的信息发送给GPU,GPU会将各层合成(composite),显示在屏幕上

3、call,apply,bind方法得作用分别是什么

call,apply和bind它们在功能上是没有区别的,都是改变this的指向,它们的区别主要是在于方法的实现形式和参数传递上的不同。call和apply方法都是在调用之后立即执行的。而bind调用之后是返回原函数,需要再调用一次才行

call,apply,bind方法:

第一个参数都是指定函数内部中this的指向(函数执行时所在的作用域),然后根据指定的作用域,调用该函数
三个都可以在函数调用时传递参数,call,bind方法需要直接传入,而apply方法需要以数组的形式传入
call,apply方法是在调用之后立即执行函数,而bind方法没有立即执行,需要将函数再执行一遍
改变this对象的指向问题不仅有call,apply,bind方法,也可以使用that变量来固定this的指向


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马