当前位置: 首页 > news >正文

记录一次大厂面试题

回流和重绘

浏览器渲染页面步骤:

  • 处理HTML标记并构建DOM树
  • 处理css标记并构建CSSOM树
  • 将DOM和CSSOM合并成一个渲染树
  • 根据渲染树来布局以计算每个节点的几何信息
  • 将各个节点绘制到屏幕上
    回流:当Render树中部分或全部元素的尺寸、布局、隐藏等改变,需要重新计算render树
    当页面布局和几何属性改变时发生回流,下面一些情况会
    重绘:当元素的样式(color/background-color/visibility等)发生变化时触发重绘
    回流必将引起重绘,重绘不一定会引起回流
    下面一些行为会引起回流:
  • 添加或删除可见的DOM元素
  • 元素的位置发生变化
  • 元素的尺寸发生变化 -边距、填充、边框、宽度、高度
  • 内容改变 -比如文本改变或者图片大小改变而引起的计算值宽度和高度改变
  • 页面渲染初始化
  • 浏览器窗口尺寸改变 -resize事件发生时
  • 一些常用且会引发回流的属性和方法:clientWidth、clientHeight、clientTop、clientLeft
    offsetWidth、offsetHeight、offsetTop、offsetLeft
    scrollWidth、scrollHeight、scrollTop、scrollLeft
    scrollIntoView()、scrollIntoViewIfNeeded()
    getComputedStyle()
    getBoundingClientRect()
    scrollTo()
    性能影响:回流比重绘的代价更高。
    如何避免
    CSS
  • 避免使用table布局。
  • 尽可能在DOM树的最末端改变class。
  • 避免设置多层内联样式。
  • 将动画效果应用到position属性为absolute或fixed的元素上。
  • 避免使用CSS表达式(例如:calc())。
    JS
  • 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。
  • 避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。
  • 也可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。
  • 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
  • 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。

Map和Object区别

都是键值对集合,区别在于object的键只能是字符串,但Map的键可以是任意类型。

call apply bind区别

  • 都可以改变函数中this指向
  • 都可以传参,参数指的是传给函数的参数,但参数形式不一样,apply只能传数组,call传列表,apply和call是一次性传参,bind可以多次传参
  • apply和call立即执行,bind不会立即执行,加个括号才执行
    为什么要改变函数this指向,比如下面这段代码,函数在setTimeout的回调中执行,this默认指向了window,我们要像让this指向obj,就需要通过这三个方法改变this指向:
var name="lucy";
var obj={name:"mark",say:function () {console.log(this.name)}
};
setTimeout(obj.say,0) //lucy
//bind方法改变this指向
setTimeout(obj.say.bind(obj),0) //mark

webpack 热更新原理

  • 使用express启动本地server,让浏览器可以请求本地静态资源
  • 启动本地server后,再启动websocket服务,通过websocket,可以建立本地服务和浏览器的双向通信,这样就实现了当本地文件发生变化后,立马告诉浏览器可以热更新代码了。

JSON.parse (JSON.stringfy())实现深拷贝的缺点

  • 如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
  • 如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
  • 如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
  • 如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
  • JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
  • 如果对象中存在循环引用的情况也无法正确实现深拷贝。

抽奖游戏转盘的实现方案

核心是计算出中奖产品对应的指针位置。大体步骤如下:

  • 前端根据奖品个数划分转盘对应的角度,如果是8个奖品那每个就是45deg,指针一般在中间位置,所以最终指向的角度是45±22.5deg(±的意思看你是顺时针还是逆时针)
  • 后端读取中间产品对应的drawIndex
this.rotateAngle = this.config.circle * 360 * this.cricleAdd - (22.5 + this.drawIndex * 45)// 圈数位置解析// this.config.circle * 360 * this.cricleAdd 顺时针总圈数/累积总圈数// 22.5 + this.drawIndex * 45 ===> (奖品位置 === this.drawIndex * 45) (指针中间位置 === 22.5) 

相关文章:

  • Linux:导出环境变量命令export
  • Android7.1 ANR error 弹窗处理
  • 全局Ceph节点宕机处理
  • PDFPlumber解析PDF文本报错:AssertionError: (‘Unhandled’, 6)
  • SpringBoot基础入门
  • fastgpt本地详细部署以及配置
  • Spring boot 集成netty实现websocket通信
  • Android 二维码相关(一)
  • 微信小程序修改placeholder样式
  • Java必须掌握的B树知识点(含面试大厂题含源码)
  • PyTorch搭建LeNet训练集详细实现
  • C语言:内存函数
  • 向ChatGPT高效提问模板
  • DAY by DAY 史上最全的Linux常用命令汇总----命令格式
  • 微信小程序返回上一页刷新组件数据
  • 《剑指offer》分解让复杂问题更简单
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 2017 年终总结 —— 在路上
  • Angular4 模板式表单用法以及验证
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • magento 货币换算
  • Rancher如何对接Ceph-RBD块存储
  • STAR法则
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue实战(四)登录/注册页的实现
  • 浮动相关
  • 观察者模式实现非直接耦合
  • 入口文件开始,分析Vue源码实现
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • !!java web学习笔记(一到五)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (LeetCode C++)盛最多水的容器
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (实战篇)如何缓存数据
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)u-boot-nand.bin的下载
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET CLR基本术语
  • .Net Core与存储过程(一)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??myeclipse+tomcat
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @EventListener注解使用说明
  • @selector(..)警告提示
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)