首页/文章/八股文

2023年-0.0.13

2024-11-30
650822 分钟
...
  • Promise 了解多少?【JavaScript】 回答链接:#1

    1. ==Promise 是异步编程的一种解决方案==,比传统的解决方案 —— 回调函数和事件 —— 更合理和更强大。它由社区最早提出和实现, ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
    2. Promise对象有以下两个特点。
      1. 对象的状态不受外界影响。
        Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled )和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是 “ 承诺 ” ,表示其他手段无法改变。
      2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
        Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件( Event )完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
        有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
        Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

  1. 9.call、apply、bind 的区别和用法?【JavaScript】 回答链接:#9

    1. call、apply 和 bind 都是 JavaScript 中用于改变函数执行上下文(即 this 指向)的方法

  • let 和 const 与 var 的区别?【JavaScript】 回答链接:#10

    1. 不存在变量提升
      必须先定义后使用,否则报错
    2. 暂时性死区
      在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
    3. 不允许重复申明/不允许在函数内部重新申明参数(也算重复申明)
    4. SE5的作用域
      1. 内层变量覆盖外层的变量
      2. 用来计数的循环变量会泄露为全局变量
    5. const是一个常量,一旦声明,就不能改变。而且在申明的时候必须初始化,不能留到后面赋值。
    6. 在ES5里面,var 在全局作用域下申明的变量,会自动生为window的属性:
      没法在编译过程爆出变量为申明的错误,语法上顶层对象有一个实体含义的对象这样肯定不合适。
      用var定义的依然会升级为顶层对象(全局对象)window的属性;但是let,const申明则不会。

19.什么是同源策略?【网络】 回答链接:#19

同源策略是一种安全机制,它是浏览器对 JavaScript 实施的一种安全限制。所谓“同源”是指==域名、协议、端口号==均相同。同源策略限制了一个页面中的脚本只能与同源页面的脚本进行交互,而不能与不同源页面的脚本进行交互。这是为了防止恶意脚本窃取数据、进行 XSS 攻击等安全问题。

同源策略限制的资源包括:

  • Cookie、LocalStorage 和 IndexDB 等存储性资源
  • AJAX、WebSocket 等发送 HTTP 请求的方法
  • DOM 节点
  • 其他通过脚本或插件执行的跨域请求

这些资源只能与同源页面进行交互,不能与不同源的页面进行交互。


24.JS数据类型有哪些,区别是什么?【JavaScript】 回答链接:#24

在 JavaScript 中,数据类型可以分为两类:原始类型和对象类型。原始类型包括:数字(number)、字符串(string)、布尔值(boolean)、null、undefined 和 Symbol(ES6 新增),对象类型包括:对象(object)、数组(array)、函数(function)等。

区别如下:

  • 原始类型的值是不可变的,对象类型的值是可变的。
  • 原始类型的值是按值访问的,对象类型的值是按引用访问的。
  • 原始类型存储在栈内存中,对象类型存储在堆内存中。

原始类型
具体来说,数字、字符串、布尔值、null 和 undefined 是 JavaScript 中的五种原始类型,它们都是不可变的。每次对原始类型进行操作时,都会创建一个新的原始类型的值。例如:

let num1 = 10;
let num2 = num1 + 5;
console.log(num1); // 10
console.log(num2); // 15

在上面的例子中,对 num1 进行操作时并没有改变 num1 的值,而是创建了一个新的值 num2。

对象类型
对象类型则是可变的,因为对象、数组、函数等值是通过引用来访问的。例如:

let obj1 = { name: '张三' };
let obj2 = obj1;
obj2.name = '李四';
console.log(obj1.name); // "李四"
console.log(obj2.name); // "李四"

在上面的例子中,修改了 obj2 的属性值,但由于 obj1 和 obj2 指向的是同一个对象,所以 obj1 的属性值也被修改了。

Symbol
除了五种原始类型和对象类型外,ES6 新增了一种原始类型:Symbol。它的主要作用是创建唯一的标识符。例如:

let s1 = Symbol();
let s2 = Symbol();
console.log(s1 === s2); // false

在上面的例子中,两个 Symbol 创建的值是不相等的,即使它们的值是一样的。

另外值得注意的是,ES6 还引入了一些新的对象类型或结构,例如 MapSetWeakMapWeakSet,以及为了更好地处理异步操作引入的 Promise 和生成器对象。这些都属于扩展的 Object 类型,增强了 JavaScript 的功能性和异步编程能力。


29.请简述 HTTP 请求的过程【网络】 回答链接:#29

HTTP(Hypertext Transfer Protocol)是一种用于传输数据的协议。当我们在浏览器中输入 URL,点击链接或提交表单时,浏览器会发送 HTTP 请求,并等待服务器的响应。以下是 HTTP 请求的基本过程:

建立连接:浏览器向服务器发出连接请求,服务器接受请求并建立连接。

发送请求:浏览器向服务器发送 HTTP 请求。请求包括请求方法(GET、POST、PUT、DELETE等)、请求头(包含一些元数据,如 Accept、Content-Type、Authorization 等)、请求体(POST 和 PUT 请求会带上数据)等。

接受请求:服务器接受请求并解析请求。服务器会根据请求的内容进行相应的处理,如查询数据库、读取文件等。

发送响应:服务器向浏览器发送 HTTP 响应。响应包括响应状态码、响应头、响应体等。常见的响应状态码包括 200 OK、404 Not Found、500 Internal Server Error 等。

接受响应:浏览器接受响应并解析响应。浏览器会根据响应的内容进行相应的处理,如渲染页面、执行 JavaScript 等。

断开连接:请求处理完毕后,浏览器和服务器会断开连接。

需要注意的是,HTTP 是一种无状态协议,即每次请求都是独立的,服务器不会保留任何关于请求的信息。为了保持客户端与服务器之间的状态,通常使用 Cookie 或 Session 等机制来保存状态信息。

此外,现代浏览器通常会使用 HTTP 缓存来提高性能。当浏览器发送请求时,如果发现资源已经在本地缓存中存在,就会直接使用缓存的版本,而不是重新从服务器下载。可以使用 Cache-Control、Expires 等响应头控制缓存的行为。


31.JS 中继承方式有哪些?【JavaScript】 回答链接:#31

1、借助构造函数实现继承

2、通过原型链实现继承

3、组合方式


32.解释一下 原型、构造函、实例、原型链 之间的关系?【JavaScript】 回答链接:#32

34.DOM事件类相关问题【JavaScript】 回答链接:#34

35.解释边距重叠【CSS】 回答链接:#35

什么是BFC

BFC (block formatting context) 及块级格式化上下文,从样式上看,具有 BFC 的元素与普通的容器没有什么区别,从功能上看,BFC相当于构建了一个密闭的盒子模型,在BFC中的元素不受外部元素的影响;

个人理解:BFC就是将盒子中子元素的属性锁在父元素中,例如margin,float 使其不影响盒子外的元素。

如何构建BFC

以下情况都会使元素产生BFC

  • 根元素或其它包含它的元素 (也就是html元素本身就是BFC)

  • float:left ,right

  • position:absolute,fixed

  • display:inline-block,table-cell,table-caption;(行内块元素与表格元素)

  • overflow:hidden,auto,scroll (非 visible属性)

  • display: flow-root

  • column-span: all


36.水平垂直居中定位【CSS】 回答链接:#36

flex布局

绝对定位


3.ES6 Generator 了解多少?【JavaScript】 回答链接:#3

ES6中的 Generator(生成器)是一种特殊类型的函数,它可以被暂停和恢复。这意味着在调用Generator函数时,它不会立即执行,而是返回一个可暂停执行的Generator对象。在需要的时候,可以通过调用.next()方法来恢复函数的执行。这使得我们能够编写更具表现力和灵活性的代码。


4.ES6 Map 数据结构了解多少?【JavaScript】 回答链接:#4

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。

Map 对象是键值对的集合。Map 中的一个键只能出现一次;它在 Map 的集合中是独一无二的。Map 对象按键值对迭代——一个 for...of 循环在每次迭代后会返回一个形式为 [key,value] 的数组。迭代按插入顺序进行,即键值对按 set() 方法首次插入到集合中的顺序(也就是说,当调用 set() 时,map 中没有具有相同值的键)进行迭代。

maps复制时不为同一个对象的引用

5.Map 和 Object 有哪些主要的区别?【JavaScript】 回答链接:#5

    1. map默认不包括任意键值,object有一个原型

    2. map的key可因为任意值,object的必须为string或者symbol

    3. map的key按照插入顺序

    4. map有一些方法,get,set,keys,values,entiies


6.如何检测对象是否循环引用?【JavaScript】 回答链接:#6

// 对 传入的 subject 对象 内部存储的所有内容执行回调
function execRecursively(fn, subject, _refs = new WeakSet()) {
  // 避免无限递归
  if (_refs.has(subject)) {
    return;
  }

  fn(subject);
  if (typeof subject === "object") {
    _refs.add(subject);
    for (const key in subject) {
      execRecursively(fn, subject[key], _refs);
    }
  }
}

const foo = {
  foo: "Foo",
  bar: {
    bar: "Bar",
  },
};

foo.bar.baz = foo; // 循环引用!
execRecursively((obj) => console.log(obj), foo);


7.es6 数据结构 Set 了解多少?【JavaScript】 回答链接:#7

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。

另外,NaN 和 undefined 都可以被存储在 Set 中,NaN 之间被视为相同的值(NaN 被认为是相同的,尽管 NaN !== NaN)。


WeakSet

基本概念

WeakSet 对象允许你将弱保持对象存储在一个集合中。

WeakSet 对象是一些对象值的集合。且其与 Set 类似,WeakSet 中的每个对象值都只能出现一次。在 WeakSet 的集合中,所有对象都是唯一的。

它和 Set 对象的主要区别有:

  • WeakSet 只能是对象的集合,而不能像 Set 那样,可以是任何类型的任意值。
  • WeakSet 持弱引用:集合中对象的引用为弱引用。如果没有其它的对 WeakSet 中对象的引用,那么这些对象会被当成垃圾回收掉。

这也意味着 WeakSet 中没有存储当前对象的列表。正因为这样,WeakSet 是不可枚举的


8.Proxy 和 Reflect 了解多少?【JavaScript】 回答链接:#8

11.常见数组排序算法有哪些?【JavaScript】 回答链接:#11

12.WebSocket 了解多少?【网络】 回答链接:#12


13.postMessage 是如何解决跨域问题的?【网络】 回答链接:#13

postMessage 是 HTML5 提供的一种跨窗口通信机制,可以在不同窗口、甚至不同域名之间进行通信,从而实现跨域通信。通过在一个窗口中调用 postMessage 方法向另一个窗口发送消息,接收窗口可以监听 message 事件,以接收发送过来的消息。

使用 postMessage 可以解决一些跨域问题,如在一个域名下的网页与其他域名下的网页进行通信。具体来说,当两个窗口的协议、主机名或端口不同时,就会发生跨域问题。但使用 postMessage 可以突破同源策略的限制,实现不同域之间的通信。

一般情况下,为了保证安全,使用 postMessage 进行跨域通信时,需要在目标窗口中设置 window.postMessage 的接收地址,只有来自该地址的消息才能被接收,从而避免了安全问题。同时,可以使用 origin 参数来限制消息来源,避免恶意攻击。


14.CORS 是如何实现跨域的?【网络】 回答链接:#14

15.JSONP 是如何实现跨域的?【网络】 回答链接:#15

16.跨域通信的常见方式有哪些?【网络】 回答链接:#16

17.ajax如何获取下载进度?【JavaScript】 回答链接:#17

18.手写创建一个 ajax 请求【JavaScript】 回答链接:#18

20.JS 有哪些迭代器,该如何使用?【JavaScript】 回答链接:#20

21.如何使对象 iterable 化, 以其可以支持 for...of 迭代【JavaScript】 回答链接:#21

22.js 对象可以使用 for...of 迭代吗?【JavaScript】 回答链接:#22

23.详细讲一下 Symbol 数据类型特征与实际使用案例?【JavaScript】 回答链接:#23

25.网络模型分层大概有哪些层级?【网络】 回答链接:#25

26.TCP 传输过程?【网络】 回答链接:#26

27.HTTP建立连接的过程?【网络】 回答链接:#27

30.实现一个双向链表, 具备添加节点、删除节点、在特定位置插入节点、查找节点、遍历等功能【JavaScript】 回答链接:#30

33.Http协议基础【网络】 回答链接:#33

2.手写 async 函数?【JavaScript】 回答链接:#2

28.HTTP 缓存策略有哪些?【网络】 回答链接:#28

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
八股文2026-08-27
定时器按顺序播放多个音频,切后台音频会乱
本身不会补触发,但 它会被系统级冻结 ——iOS Safari 后台完全停止计时,切回前台后 只补执行一次 (不是不补,而是"缺失的中间状态补不上")。间隔短的不会出大问题, 间隔长的会出现"音频流被压缩" ——切回来后本该播 5 分钟的间隙,实际只过了 3 分钟,结果整段对不上。 核心原则 :定时器只能用来"提醒一次", 真正决定"该不该播"的是绝对时间戳 。 setTimeout 在后台会发生什么(按平台) | 平台 | 后台行为...
面试
八股文2026-08-27
线上项目白屏的原因
白屏的本质是 渲染管线某一环断了 ——可能是资源、JS、接口、路由、样式、兼容性任一环节出问题。排查按"控制台 → 网络 → DOM → 环境"四步定位。 本质(前端类比) 把网页想成一栋楼: 白屏 ≠ 一定是同一种原因——这是面试想听的层次。 六大类原因(按出现频率) | 类别 | 典型表现 | 真实案例 | | : | : | : | | ① 资源加载失败 | DOM 是空的 | 入口 JS 404、CDN 挂了、CSS 阻塞 |...
面试
八股文2026-08-27
背景图就是 1MB 大图,怎么优化
1MB 大背景图优化分 三步 :压缩体积(10 30x)、按需加载(按设备/视口/网速)、渲染期优化(GPU 合成)。背景图跟 不同——它是 CSS,不走浏览器的原生懒加载机制,得手动处理。 背景图 vs 的关键区别(先讲清楚这个) 这是面试官想听的"针对性认知"——背景图不是普通图片,不能套通用方案。 三步优化(按优先级) 第 1 步:压缩体积(最重要,立竿见影) 1MB 的来源一般是这几种 ,对应解决方案: | 原始问题 | 体积来...
面试
八股文2026-08-27
项目里很多图片和视频,怎么优化
图片视频优化分 四层 :网络层(CDN/格式)、加载层(懒加载/预加载)、渲染层(解码/缓存)、业务层(按需/降级)。面试要把这四层都讲到位才算有体系。 四层优化模型 第 1 层:网络层(省钱、省时间) 核心目标:让资源体积小、让用户拿到资源快 | 手段 | 作用 | 关键点 | | : | : | : | | 图片格式 | WebP/AVIF 比 JPEG 小 25 50% | 兼容 fallback | | 视频格式 | H.265...
面试
八股文2026-08-20
Embedding 向量模型:从语义表示到相似度计算
前言 大模型「读懂」文字靠的是 token,但 token 之间只有离散的编号关系,模型并不知道「苹果」和「李子」在语义上很近。要让程序能「理解」两段文字的相似程度,必须先把文本映射成一个 高维向量 ,再用几何方法比较。这一步就是 Embedding。 本篇基于我本地 今天的真实代码,从语义表示讲到余弦相似度,并复盘几个踩过的真实坑。 一、为什么需要 Embedding 传统关键词检索是「字面匹配」: Embedding 做的是「语义匹...
面试
八股文2026-08-19
前端面试100题
前端面试 100 题 适用方向:中高级前端 / React / Vue / Next.js / Nuxt / TypeScript / 工程化 / 实时通信 / Electron / Node.js / AI 应用前端 使用方式:优先掌握“标准回答”,再练“面试官追问”,最后把“结合你的简历怎么答”组织成自己的项目故事。 说明 “结合你的简历怎么答”只使用你简历中已经出现的项目与技术事实。 “标准回答 / 追问”属于通用前端知识总结,用...
面试

评论

请登录后发表评论

去登录
加载评论中...

目录