公司面试题总结(五)

25.谈一谈箭头函数与普通函数的区别,箭头函数主要解决什么问题?

箭头函数与普通函数的区别

语法简洁性:

箭头函数使用=>符号定义,省略了 function 关键字,使得语法更为紧凑。
对于单行函数体,可以进一步简化,省略花括号和 return 语句。

词法作用域内的 this:

主要区别:箭头函数不绑定自己的 this 值,它会捕获其所在上下文的 this 值作为
自己的 this,这解决了长期以来关于函数内部 this 指向不确定的问题。
在普通函数中,this 的值取决于函数如何被调用(例如,作为对象方法、构造函数
或者简单函数调用)。

没有自己的 arguments:

箭头函数没有自己的 arguments 对象,但可以通过扩展运算符...或其他方法间接访
问外部作用域的 arguments。
普通函数有自己的 arguments 对象来访问传入的参数。

不能作为构造函数:

箭头函数不能用作构造函数,即不能使用 new 关键字实例化。
普通函数可以作为构造函数创建新对象。

不能改变 this 的绑定:

使用 call、apply 或 bind 方法不能改变箭头函数内部的 this 指向。
普通函数的 this 可以通过这些方法动态改变。

箭头函数主要解决的问题:

明确的 this 绑定:

箭头函数最显著的优势在于它消除了 this 的不确定性,使得在回调函数、事件处理器等场景下,this 能保持预期的行为,避免了手动绑定 this 的繁琐。

代码简洁性:

它的简洁语法减少了代码量,提高了代码的可读性和维护性,特别是在使用高阶函数和函数式编程风格时更为明显。

减少作用域链查找:

由于箭头函数没有自己的 this、a rguments 等,这可能轻微提升执行效率,尤其是在大量嵌套函数调用时。

26.JS 数组和对象的遍历方式,以及几种方式的比较

数组的遍历方式:

for 循环

基本用法,适用于所有版本的 JavaScript。
可以获取索引和值。

forEach()

ECMAScript 5 引入的方法,直接在数组上操作,无需索引。
不支持 break,continue 语句。

for...of

ECMAScript 6 引入,迭代数组的元素值。
直观简洁,同样不支持 break,continue(除非配合 label)。

map()

生成新数组,原数组每个元素经过处理后的结果组成新数组返回。
侧重于转换数据。

filter()

创建一个包含通过测试的所有元素的新数组。
侧重于筛选数据。

对象的遍历方式:

for...in

遍历对象的所有可枚举属性(包括原型链上的)。
通常需要检查属性是否属于对象本身(hasOwnProperty)。
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
console.log(key + ": " + obj[key]);
}
}

Object.keys()结合 for...of

获取对象自身可枚举属性的数组,然后遍历。
更安全,不涉及原型链。
for(let key of Object.keys(obj)) {
console.log(key + ": " + obj[key]);
}

Object.entries()结合 for...of

获取键值对数组,适合同时需要键和值的场景。
for(let [key, value] of Object.entries(obj)) {
console.log(key + ": " + value);
}

ES2022 的 for...in 改进

ES2022 引入了可选的 enumerable 标志,可以更精确地控制哪些属性可遍历。

比较:

性能:

基础的 for 循环通常性能最好,因为它是直接基于索引访问。
forEach()等方法由于涉及到函数调用,性能略低。不过,在大多数应用场景中,这
种差异微乎其微,可忽略。

可读性:

for...of、forEach()等现代遍历方法更易于阅读和理解,特别是对于不熟悉传统循环的新手。

功能

map()、filter()等方法不仅遍历,还能直接对数据进行转换或筛选,适合处理数据流。

兼容性:

for...of、Object.entries()等 ES6 及以上特性的方法需要考虑浏览器或环境的兼容性。

27.什么是跨域,如何解决跨域的问题,具体说说

跨域本质是浏览器基于同源策略的一种安全手段
同源策略 (Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能
协议相同(protocol)、主机相同(host)、端口相同(port)
非同源请求,也就是协议、端口、主机其中一项不相同的时候,这时候就会产生跨域

使用代理服务器(Proxy Server)

在开发环境中,可以配置一个代理服务器来转发 API 请求,从而绕过浏览器的同
源策略。这种方法通常使用 webpack-dev-server 或 Vite 的内置代理功能。
Vue CLI 项目 vue.config.js 文件中进行配置:

 对于 Vite 项目 vite.config.js 文件中进行配置:

设置 CORS(跨来源资源共享)

CORS 是一种 W3C 规范,定义了一种浏览器和服务器交互的方式来确定是否允
许跨源请求。这需要在服务器端进行配置。
服务器端需要设置响应头来允许来自不同源的请求。例如,在 Node.js 的 Express
框架中,可以使用 cors 中间件来设置 CORS。

JSONP

原理是利用<script>标签没有跨域限制的特点
通过动态插入<script>标签来加载其他域的 JavaScript 资源。
JSONP 只支持 GET 请求,并且存在安全风险(如 XSS 攻击)。

反向代理服务器(如 Nginx)

在 Nginx 中配置代理转发,并将 CORS 响应头添加到代理的响应中。

28.说说你对单点登录的理解,如何实现单点登录?

单点登录 Single Sign On,简称 SSO

多个应用系统,用户只需要登录一次就可以访问所有相互信任的应用系统
SSO 需要一个独立的认证中心 passport,子系统登录均得通过 passport,子系统不参与
登录
当一个系统成功登录以后,passport 将会颁发一个令牌给各个子系统,子系统可以拿着
令牌会获取各自的受保护资源,为了减少频繁认证,各个子系统在被 passport 授权以
后,会建立一个局部会话,在一定时间内可以无需再次向 passport 发起认证

如何实现

同域名下的单点登录

cookie 的 domain 属性设置为当前域的父域,
父域的 cookie 会被子域所共享。
path 属性为根路径

不同域名下的单点登录(一)

如果是不同域的情况下,Cookie 是不共享的用户统一
在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 token 写
入 Cookie(Cookie 是认证中心的,应用系统访问不到)
应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,
那么就将页面跳转至认证中心
由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根
据 Cookie 知道用户是否已经登录过了
如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录
如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL,
并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统
应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,
此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法

不同域名下的单点登录(二)

将 Session ID/Token 保存到浏览器的 LocalStorage 中,让前端在每次向后端发送
请求时,主动将 LocalStorage 的数据传递给服务端
这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将 Session ID
(或 Token)放在响应体中传递给前端

30.谈谈你对 webpack 的看法

webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具
静态模块指的是开发阶段
可以被 webpack 直接引用的资源(可以直接被获取打包进 bundle.js 的资源)
当 webpack 处理应用程序时,会在内部构建一个依赖图
依赖图对应映射到项目所需的每个模块(不再局限 js 文件),并生成一个或多个 bundle
webpack 的能力:
编译代码能力(es6 es5) ,提高效率,解决浏览器兼容问题
模块整合能力 ,提高性能,可维护性,解决浏览器频繁请求文件的问题 万物皆可模块能力 ,项目维护性增强,支持不同种类的前端模块类型,统一的模块化方
案,所有资源文件的加载都可以通过代码控制。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe illustrator教程——超实用的三个进阶小技巧!

AI2024(64bit) Adobe illustrator 软件安装包下载地址&#xff1a; 百度网盘下载https://pan.baidu.com/s/1C10-2JVN1rxFF5VFRuV2Yw?pwdSIMS 01 进阶技巧1——曲率工具 基于之前的入门教程&#xff0c;大家肯定会快速想到“画笔工具”&#xff0c;但是画出来的曲线往往不够平…

12.实战私有数据微调ChatGLM3

实战私有数据微调ChatGLM3 实战私有数据微调ChatGLM3实战构造私有的微调数据集基于 ChatGPT 设计生成训练数据的 Prompt使用 LangChain GPT-3.5-Turbo 生成训练数据样例训练数据解析、数据增强和持久化存储自动化批量生成训练数据集流水线提示工程&#xff08;Prompt Engineer…

Linux操作系统学习路线

本文来自Qwen2大模型&#xff1a; Linux操作系统的全面学习是一个渐进的过程&#xff0c;涵盖从基础知识到高级特性的多个阶段。以下是一份详细的Linux操作系统学习路线图&#xff0c;包括各个阶段的学习目标、建议的学习资源和实践步骤。 1. Linux 基础知识与安装 学习目标&a…

《软件定义安全》之八:软件定义安全案例

第8章 软件定义安全案例 1.国外案例 1.1 Fortinet&#xff1a;传统安全公司的软件定义方案 Fortinet的软件定义安全架构强调与数据中心的结合&#xff0c;旨在将安全转型为软件定义的模式&#xff0c;使安全运维能够与数据中心的其他部分一样灵活、弹性。在Fortinet看来&…

单链表经典算法题 1

前言 学习了单链表&#xff0c;我们就做一些题来巩固一下。还有就是解题方法不唯一&#xff0c;我就只讲述为自己的方法。 目录 前言 1.移除链表元素 思路 代码 2.反转链表 思路 代码 3.链表的中间节点 思路 代码 总结 1.移除链表元素 思路 我们创建一个新的表…

GUI初步开始(matlab)

GUI初步开始&#xff08;matlab&#xff09; &#xff08;自用笔记&#xff09; 打工人艰辛速成&#xff0c;花几个小时从零到能用&#xff0c;记录下details and problems&#xff1a; 甲方要求&#xff1a;GUI界面&#xff0c;读下位机&#xff0c;找到解码后格式中所需要的…

搭建WWW服务

1.实验环境的配置 【1】设置windows虚拟机server和test网络属性 打开虚拟机的【开始】菜单->【控制面板】->【网络连接】窗口。 1. 选中【本地连接】右击鼠标&#xff0c;选中【属性】&#xff0c;打开【本地连接属性】窗口。 2. 选择【网络】页签。 3. 在【此连接使…

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…

刚刚!彬川机器人社招校招入职Verify测评素质性格测评真题原题题库更新了【含答案】

一、测评环境 温馨提示 1.本次测评包含【素质性格测评】和【Verify测评】两部分&#xff0c;预计用时60min&#xff0c;请确保作答时周围环境无干扰、网络畅通&#xff1b; 2.请使用电脑完成作答&#xff0c;建议使用以下浏览器登录&#xff1a;IE9.0及以上版本&#xff0c;火…

5. 条件和递归

5. 条件和递归 本章主要话题是if表达式, 它根据程序的状态执行不同的代码. 但首先介绍两个操作符号: 向下取整除法操作符和求模操作符.5.1 向下取整除法操作符和求模操作符 向下取整除法操作符(//)对两个数除法运算, 并向下取整得到一个整数. 假设, 一个电影的播放时长为105分…

94. 二叉树的中序遍历(Swift实现, 迭代)

题目描述 使用迭代方法解题 class TreeNode {var val: Intvar left: TreeNode?var right: TreeNode?init(_ val: Int) {self.val valself.left nilself.right nil} }func inorderTraversal(_ root: TreeNode?) -> [Int] {var result [Int]() // 用于存储中序遍历…

day37| 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字

文章目录 前言435. 无重叠区间思路方法一方法二 763.划分字母区间思路方法二 补充内容 重叠区间 56. 合并区间思路方法一 我自己写的方法二 教程的思路【更巧妙&#x1f636;】 738.单调递增的数字思路方法一方法二 使用list、不使用flag 总结 前言 435. 无重叠区间 注意&…

【PL理论】(22) 函数式语言:多参数 | 柯里化 (Currying) : 将多参数函数实现为返回一个函数的函数

&#x1f4ad; 写在前面&#xff1a;本章我们将继续讲解函数式语言&#xff0c;介绍多参数&#xff0c;着重讲解柯里化的概念&#xff0c;将多参数函数实现为返回一个函数的函数。 目录 0x00 多参数&#xff08;Multiple Arguments&#xff09; 0x01 柯里化&#xff08;Curr…

【车载音视频电脑】双卡式行车记录仪,带AI识别分析,支持4路AHD 1080p高清输入

一、产品外观 外观专利设计&#xff0c;铝合金材质&#xff0c;散热好、小巧、易安装&#xff1b;塑胶前面板&#xff0c;美观简洁大方&#xff0c;有独立锁。 二、产品特点 支持4路AHD高清输入1080P*30FPS、720P、D1、CIF分辨率等&#xff1b;支持接IPC&#xff0c;用网口&a…

Java | Leetcode Java题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxPoints(int[][] points) {int n points.length;if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i) {if (ret > n - i || ret > n / 2) {break;}Map<Integer, Integer> map ne…

VScode中连接并使用docker容器

前提条件&#xff1a; 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode&#xff0c;按下图顺序操作 调试好之后上传到git上&#xff0c;然后后面…

算法day29

第一题 695. 岛屿的最大面积 本题解法&#xff1a;采用bfs的算法&#xff1b; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素&#xff0c;防治被遍历的元素被二次遍历&#xff1b; 本题具体分析如上题故事&#xff0c;但是由于要求区域的最大面…

5.7 Python内置函数

文章目录 1. 内置模块Aabs()all()any()ascii() Bbin()bool()bytearra()bytes() Ccallable()chr()classmethod()compile()complex() Ddelattr()dict()dir()divmod() Eenumerate()eval()exec()execfile() Ffile()filter()float()format()frozenset() Ggetattr()globals() Hhasatt…

django学习入门系列之第二点《浏览器能识别的标签3》

文章目录 列表表格往期回顾 列表 无序列表 <!-- <ul </ul> 无序列表 --> <ul><li> 内容1 </li><li> 内容2 </li><li> 内容3 </li><li> 内容4 </li> </ul>有序列表 <!-- <ol> &…

自动控制理论---零点和极点、单位脉冲响应

1、实验设备 PC计算机1台&#xff0c;MATLAB软件1套。 2、实验目的 研究四个具有相同极点分布但不同零点分布的二阶系统对单位脉冲响应的影响。绘制各系统的零点和极点分布图。计算并绘制各系统的单位脉冲响应波形。分析零点分布对单位脉冲响应的影响。 3、实验原理说明&am…