前端面试题(基础篇十)

一、JavaScript内置类型

JS 中分为七种内置类型,七种内置类型⼜分为两⼤类型:基本类型和对象 ( Object )。

基本类型有六种: null undefined boolea n, number string symbol

其中 JS 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754 标准实 现,在使⽤中会遇到某些 Bug。 NaN(not a number) 也属于 number 类型,并且 NaN 不等于⾃身。

对于基本类型来说,如果使⽤字⾯量的⽅式,那么这个变量只是个字⾯量,只有在必要的 时候才会转换为对应的类型。

let a = 111 // 这只是字⾯量,不是 number 类型
a.toString() // 使⽤时候才会转换为对象类型

对象( Object )是引⽤类型,在使⽤过程中会遇到浅拷⻉和深拷⻉的问题

let a = { name: 'FE' }
let b = a
b.name = 'EF'
console.log(a.name) // EF

二、深浅拷贝

letet a a = {age : 1
}
let b = a
a.age = 2
console.log(b.age) // 2

从上述例⼦中我们可以发现,如果给⼀个变量赋值⼀个对象,那么两者的值会是同⼀个引 ⽤,其中⼀⽅改变,另⼀⽅也会相应改变。

通常在开发中我们不希望出现这样的问题,我们可以使⽤浅拷⻉来解决这个问题

浅拷贝

⾸先可以通过 Object.assign 来解决这个问题

let a = {age: 1
}
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1

当然我们也可以通过展开运算符 来解决

let a = {age: 1
}
let b = {...a}
a.age = 2
console.log(b.age) // 1
通常浅拷⻉就能解决⼤部分问题了,但是当我们遇到如下情况就需要使⽤到深
拷⻉了
let a = {age: 1,jobs: {first: 'FE'}
}
let b = {...a}
a.jobs.first = 'native'
console.log(b.jobs.first) // native
浅拷⻉只解决了第⼀层的问题,如果接下去的值中还有对象的话,那么就⼜回
到刚开始的话题了,两者享有相同的引⽤。要解决这个问题,我们需要引⼊深

深拷贝

这个问题通常可以通过 JSON.parse(JSON.stringify(object)) 来解决
let a = {age: 1,jobs: {first: 'FE'}
}
let b = JSON.parse(JSON.stringify(a))
a.jobs.first = 'native'
console.log(b.jobs.first) // FE

但是该⽅法也是有局限性的:

会忽略 undefined

不能序列化函数

不能解决循环引⽤的对象

let obj = {a: 1,b: {c: 2,d: 3,},
}
obj.c = obj.b
obj.e = obj.a
obj.b.c = obj.c
obj.b.d = obj.b
obj.b.e = obj.b.c
let newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj)

如果你有这么⼀个循环引⽤对象,你会发现你不能通过该⽅法深拷⻉

在遇到函数或者 undefined 的时候,该对象也不能正常的序列化

let a = {age: undefined,jobs: function() {},name: 'poetries'
}
let b = JSON.parse(JSON.stringify(a))
console.log(b) // {name: "poetries"}
你会发现在上述情况中,该⽅法会忽略掉函数和`undefined。
但是在通常情况下,复杂数据都是可以序列化的,所以这个函数可以解决⼤部分问题,并
且该函数是内置函数中处理深拷⻉性能最快的。当然如果你的数据中含有以上三种情况下,可以使⽤ lodash 的深拷⻉函数。

三、跨域

因为浏览器出于安全考虑,有同源策略。也就是说,如果协议、域名或者端⼝
有⼀个不同就是跨域, Ajax 请求会失败

跨域的解决方式

JSONP

JSONP 的原理很简单,就是利⽤ <script> 标签没有跨域限制的漏洞。通
<script> 标签指向⼀个需要访问的地址并提供⼀个回调函数来接收数据
当需要通讯时
<script src="http://domain/api?param1=a&param2=b&callback=jsonp"></script>
<script>function jsonp(data) {console.log(data)
}
</script>

JSONP 使⽤简单且兼容性不错,但是只限于 get 请求

CORS

CORS 需要浏览器和后端同时⽀持
浏览器会⾃动进⾏ CORS 通信,实现 CORS 通信的关键是后端。只要后端实现了 CORS ,就实现了跨域。
服务端设置 Access-Control-Allow-Origin 就可以开启 CORS 。 该属性表示哪些域名 可以访问资源,如果设置通配符则表示所有⽹站都可以访问资源

document.domain

该⽅式只能⽤于⼆级域名相同的情况下,⽐如 a.test.com b.test.com 适⽤于该⽅
只需要给⻚⾯添加 document.domain = 'test.com' 表示⼆级域名都相同就可以实现跨

postMessage

这种⽅式通常⽤于获取嵌⼊⻚⾯中的第三⽅⻚⾯数据。⼀个⻚⾯发送消息,另
⼀个⻚⾯判断来源并接收消息
// 发送消息端
window.parent.postMessage('message', 'http://blog.poetries.com');
// 接收消息端
var mc = new MessageChannel();
mc.addEventListener('message', (event) => {var origin = event.origin || event.originalEvent.origin;if (origin === 'http://blog.poetries.com') {console.log('验证通过')}
});

四、渲染机制

浏览器的渲染机制⼀般分为以下⼏个步骤

处理 HTML 并构建 DOM 树。

处理 CSS 构建 CSSOM 树。

DOM CSSOM 合并成⼀个渲染树。

根据渲染树来布局,计算每个节点的位置。

调⽤ GPU 绘制,合成图层,显示在屏幕上

在构建 CSSOM 树时,会阻塞渲染,直⾄ CSSOM 树构建完成。并且构建 CSSOM 树是⼀
个⼗分消耗性能的过程,所以应该尽量保证层级扁平,减少过度层叠,越是具体的 CSS 选
择器,执⾏速度越慢
当 HTML 解析到 script 标签时,会暂停构建 DOM,完成后才会从暂停的地⽅重新开始。
也就是说,如果你想⾸屏渲染的越快,就越不应该在⾸屏就加载 JS ⽂件。并且 CSS 也会
影响 JS 的执⾏,只有当解析完样式表才会执⾏ JS,所以也可以认为这种情况下,CSS 也
会暂停构建 DOM

图层

⼀般来说,可以把普通⽂档流看成⼀个图层。特定的属性可以⽣成⼀个新的图
层。不同的图层渲染互不影响,所以对于某些频繁需要渲染的建议单独⽣成⼀
个新图层,提⾼性能。但也不能⽣成过多的图层,会引起反作⽤
通过以下⼏个常⽤属性可以⽣成新图层
3D 变换: translate3d translateZ
will-change
video iframe 标签
通过动画实现的 opacity 动画转换
position: fixed

重绘(Repaint)和回流(Reflow)

重绘是当节点需要更改外观⽽不会影响布局,⽐如改变 color 就叫称为重绘

布局或者⼏何属性需要改变就称为回流

回流必定会发⽣重绘,重绘不⼀定会引发回流。回流所需的成本⽐重绘⾼的
多,改变深层次的节点很可能导致⽗节点的⼀系列回流

重绘和回流其实和 Event loop 有关

Event loop 执⾏完 Microtasks 后,会判断 document 是否需要更新。因为浏览

器是 60Hz 的刷新率,每 16ms 才会更新⼀次。 然后判断是否有 resize 或者 scroll ,有的话会去触发事件,所以 resize scroll 事件也是⾄少 16ms 才会触发⼀次,并且⾃带节流功能。

判断是否触发了 media query(媒介查询)更新动画并且发送事件

判断是否有全屏操作事件

执⾏ requestAnimationFrame 回调

执⾏ IntersectionObserver 回调,该⽅法⽤于判断元素是否可⻅,可以⽤于懒加载

上,但是兼容性不好

减少重绘和回流

使⽤ translate 替代 top

使⽤ visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流 (改变了布局)

不要使⽤ table 布局,可能很⼩的⼀个⼩改动会造成整个 table 的重新布局

动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使⽤

requestAnimationFrame

CSS 选择符从右往左匹配查找,避免 DOM 深度过深

将频繁运⾏的动画变为图层,图层能够阻⽌该节点回流影响别的元素。⽐如对于 video

标签,浏览器会⾃动将该节点变为图层

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL简介:开源数据库的基石(一)

目录 引言&#xff1a;数据库领域的革新者 一、MySQL的发展历程&#xff1a;从开源先锋到行业领袖 二、MySQL的核心特性&#xff1a;性能、安全与灵活性并重 三、MySQL的应用场景&#xff1a;从Web开发到企业级应用的全面覆盖 四、MySQL在开源数据库中的地位&#xff1a;开…

梳理湖南省各市市场监督管理专项资金申请条件对象及认定补贴流程

第一章 总 则 第一条 为加强和规范湖南省市场监督管理专项资金管理&#xff0c;提高资金使用效益&#xff0c;根据《中华人民共和国预算法》《中共中央 国务院关于全面实施预算绩效管理的意见》《湖南省人民政府关于进一步深化预算管理制度改革的实施意见》(湘政发〔2021〕14号…

Excel直接打开csv文件后,数据不能正常显示的解决方法

很多处理公司数据的同事偶尔也会遇到使用Microsoft的Excel或者金山的WPS打开csv文件后&#xff0c;发现数据不能正常显示&#xff0c;其实csv属于一种数据库文件&#xff0c;遵循数据库存储的规则&#xff0c;建议使用导入的方式进行打开。 1.打开一张空白的Excel表&#xff0…

Spring Boot 集成 H2 数据库

1. 引言 Spring Boot 以其简洁的配置和快速开发能力&#xff0c;成为现代微服务架构的首选框架之一。而H2数据库作为一个轻量级的内存数据库&#xff0c;非常适合开发阶段作为嵌入式数据库进行单元测试和功能验证。本文将手把手教你如何在Spring Boot项目中集成H2数据库&#…

Open3D 显示带有强度的点云数据

目录 一、概述 1.1强度信息的意义 1.2应用场景 二、代码实现 三、实现效果 一、概述 在点云数据中&#xff0c;强度&#xff08;Intensity&#xff09;指的是激光雷达传感器在扫描环境时&#xff0c;每个点返回的反射强度值。这些强度值代表了激光脉冲返回的能量&#xff…

Python + Playwright(19):Clock 测试时间相关行为API

Python + Playwright(19):Clock 测试时间相关行为API 概述Clock API 的重要性Clock API 的详细说明初始化时钟并设置特定时间暂停时钟快进时钟代码示例高级用法模拟网络延迟测试异步操作实践建议测试前清理环境分离时间相关和非时间相关的测试使用明确的断言注意事项恢复时钟…

centos 破解密码

重启您的CentOS系统。 在GRUB引导加载器启动过程中&#xff0c;当看到启动画面时&#xff0c;按下e键进入编辑模式。 找到以 linux16 或 linux 开头的启动行。 在该行的末尾添加 rd.break 或者ro&#xff08;只读&#xff09;修改为 rw 加init/sysroot/bin/sh参数&#xff0…

IPQ5018 SPF12.2 CSU3 编译指南

编译和加载image 1. 从高通的门户网站下载高通技术公司(QTI)专有的CHIPCODE 2. 在编译默认配置时,下载QSDK的相关组件 3. 生成固件: a. 重新组装代码,生成QSDK 框架 b. 设置并创建QSDK c. 生成一个完整的固件镜像 4. flash 烧写软件映像 安装编译环…

torchaudio.load() 和 librosa.load() 的返回值区别

问题 之前都在使用librosa加载音频数据&#xff0c;今天看到一段代码是用torchaudio加载的音频&#xff0c;发现torchaudio加载的数据和librosa返回的结果不一致。 查看资料后做出以下对比&#xff1a; torchaudio.load 函数返回一个包含两个张量的元组: 音频数据张量,形状为…

Nacos详解

nacos官方文档&#xff1a;https://nacos.io/ 一、什么是nacos&#xff1f; Nacos是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 nacos官方文档&#xff1a;https://nacos.io/ nac…

C语言-二级指针应用场景

二级指针应用 引子:在线性表 销毁函数中,传入二级指针作为参数,可以实现对线性表的销毁操作。 //销毁已存在的线性表 void DestroyList(list_t **L){// Step 1: 检查L是否为非空指针if(L) // Step 2: 释放L指向的内存空间free(*L);// Step 3: 将L所指向的指针置为NULL&#xff…

数据结构--栈(图文)

栈是一种基本的抽象数据类型&#xff0c;具有后进先出的特点。在栈这种数据结构中&#xff0c;元素只能在一端进行插入和删除操作&#xff0c;这一端被称为栈顶&#xff08;Top&#xff09;&#xff0c;而另一端则称为栈底&#xff08;Bottom&#xff09;。 栈的概念及特点 栈…

springboot社区维修平台

设计技术&#xff1a; springboot、mysql、maven、前端vue 主要功能&#xff1a; 住户管理、社区公告管理、维修工管理、维修订单管理、接单信息管理、订单信息管理、在线沟通管理、举报信息管理、留言板管理、系统管理等功能模块。 管理员功能模块 管理员通过后台登录页面…

4.2 sql手工注入和自动注入实战(OWASP实战训练)

4.2 sql手工注入和自动注入实战&#xff08;OWASP实战训练&#xff09; 引言1. information_schema1.1 查询数据库名&#xff08;TABLE_SCHEMA&#xff09;、表名&#xff08;TABLE_NAME&#xff09; information_schema.tables1.2 查询数据库名、表名、字段名&#xff08;colu…

基于单片机和 Arduino 平台的六自由度可控机械手臂

摘 要 : 为了降低机械手臂的设计开发难度 &#xff0c; 并使之尽早地投入应用 &#xff0c; 设计一种基于单片机和 Arduino 平台的六自由度可控机械手臂 。提出六自由度可控机械手臂的控制方案&#xff0c; 给出机械手臂控制系统的结构框图 。 详细设计六自由度可控机械手臂…

Websocket在Java中的实践——自动注册端点

在《Websocket在Java中的实践——握手拦截器》中我们使用握手拦截器实现了路径解析的工作。这个过程略显复杂&#xff0c;因为路径解析这样比较底层的工作应该由框架来解决&#xff0c;而不应该交由开发者来做。本文介绍的自动注册端点的功能就可以很优雅的解决这个问题。 依赖…

【机器学习】python之人工智能应用篇--游戏生成技术

游戏生成技术&#xff0c;特别是生成式人工智能&#xff08;Generative Artificial Intelligence, 简称Generative AI&#xff09;&#xff0c;正逐步革新游戏开发的多个层面&#xff0c;从内容创作到体验设计。这些技术主要利用机器学习、深度学习以及程序化内容生成&#xff…

Batch入门学习

Batch脚本是一种用于自动化任务的脚本语言&#xff0c;主要在Windows操作系统下使用。它通过一系列命令语句来执行特定的任务&#xff0c;如文件管理、程序执行等。下面是Batch脚本入门学习的基本内容&#xff1a; ### 1. 基础语法 #### 文件扩展名 Batch脚本的文件扩展名通常…

[C++][设计模式][原型模式]详细讲解

1.动机 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的接口如何应对这种变化&#xff1f;如何向“客户程序(使用这些对象的程序)”隔离出…

【python语法】*args和**kwargs的理解

*args 是打包和拆分为元组 args有两部分构成为——和args。这里的重点是。 所以为了讲清楚args&#xff0c;我们要追根溯源——理解*的作用。这里的args只是一个参数名称而已&#xff0c;可以用其他的替换&#xff0c;比如下面的示例中都使用number进行替换。 *的作用&#x…