前端八股文经验分享:面试拷打经历 与 知识总结(纯个人总结)(八)

编程入门 行业动态 更新时间:2024-10-08 10:49:38

前端八股文<a href=https://www.elefans.com/category/jswz/34/1770055.html style=经验分享:面试拷打经历 与 知识总结(纯个人总结)(八)"/>

前端八股文经验分享:面试拷打经历 与 知识总结(纯个人总结)(八)

1. 浏览器的一帧都会干些什么?

页面时一帧一帧绘制出来的,目前大多浏览器时 60Hz,每一帧耗时 16.6ms

浏览器一帧所经历的过程:

  • 接收输入事件
  • 执行回调事件
  • 开始一帧
  • 执行 RAF
  • 页面布局,样式计算
  • 绘制渲染
  • 执行 RIC

2. Objet.defineProperty 与 Proxy 的区别

在 Vue2.x 的版本中,双向绑定是基于 Object.defineProperty 方式实现的。而 Vue3.x 版本中,使用了 ES6 中的 Proxy 代理的方式实现。


1. 使用 Object.defineProperty 会产生三个主要的问题

  • 不能监听数组的变化
  • 必须遍历对象的每个属性。可以通过 Object.keys() 来实现
  • 必须深层遍历嵌套的对象。通过递归深层遍历嵌套对象,然后通过 Object.keys() 来实现对每个属性的劫持

2. 关于Proxy

  • Proxy 针对的整个对象,Object.defineProperty  针对单个属性,这就解决了需要对对象进行深度递归(支持嵌套的复杂对象劫持)实现对每个属性劫持的问题
  • Proxy 解决了 Object.defineProperty 无法劫持数组的问题
  • 比 Object.defineProperty 有更多的拦截方法,对比一些新的浏览器,可能会对 Proxy 针对性的优化,有助于性能提升

3. 虚拟DOM

虚拟 DOM 是通过 JS 对象模拟出来得 DOM 节点,DOM 操作时性能杀手,操作 DOM 会引起页面得回流或重绘,因此使用虚拟 DOM 可以提高代码的性能下限,并极大的优化大量的操作 DOM 时产生的性能损耗

4. new 和 Object.create 的区别

比较newObject.create
构造函数保留原构造函数属性丢失原构造函数属性

原型链

原构造函数prototype属性原构造函数 / (对象)本身
作用对象functionfunction 和 object

5. Websocket 中的心跳机制是为了解决什么问题

  • 为了定时发送消息,使连接不超时自动断线,避免后端设了超时时间自动断线。所以需要定时发送消息给后端,让后端服务器知道连接还在通消息不能断。
  • 为了检测在正常连接的状态下,后端是否正常。如果我们发了一个定时检测给后端,后端按照约定要下发一个检测消息给前端,这样才是正常的。如果后端没有正常下发,就要根据设定的超时进行重连。

6. Promise中,resolve后面的语句是否会执行?

会被执行。如果不需要执行,需要在 resolve 语句前面加上 return

7. CSR 和 SSR 分别是什么?

CSR:对于 html 的加载,以 React 为例,我们习惯的做法是加载 js 文件中的 React 代码,去生成页面渲染,同时,js 也完成页面交互事件的绑定,这样的一个过程就是 CSR (客户端渲染)。


SSR:但如果这个 js 文件比较大的话,加载起来就会比较慢,到达页面渲染的时间就会比较长,导致首屏白屏。这时候,SSR (服务端渲染)就出来了:由服务端直接生成 html 内容返回给浏览器渲染首屏内容。


但是服务端渲染的页面交互能力有限,如果要实现复杂交互,还是要通过引入 js 文件来辅助实
现,我们把页面的展示内容和交互写在一起,让代码执行两次,这种方式就叫同构。


CSR 和 SSR 的区别在于,最终的 html 代码是从客户端添加的还是从服务端。

8. 函数式编程的理解,以及有何优缺点

函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而非设计一个复杂的执行过程

优点:

  • 更好的管理状态
  • 更简单的复用
  • 更优雅的组合
  • 隐性好处,减少代码量


缺点:

  • 性能
  • 资源占用
  • 递归陷阱

9. JavaScript 中执行上下文和执行栈是什么?

执行上下文:是一种对 JS 代码执行环境的抽象概念,也就是说,只要有JS代码执行,那么它就一定运行在执行上下文中

(全局执行上下文、函数执行上下文,Eval 函数执行上下文)


执行栈:执行栈,也叫调用栈,具有 LIFO(后进先出)结构,用于存储在代码执行期间创建的所有执行上下文

10. 对ES6中Module(模块化)的理解

理解: 模块,(Module),是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体)。

有两个基本的特征:外部特征 和 内部特征

  • 外部特征是指模块跟外部环境联系的接口(即其他模块或程序调用该模块的方式,包括有输入输出参数、引用的全局变量)和模块的功能
  • 内部特征是指模块的内部环境具有的特点(即该模块的局部数据和程序代码)

为什么需要模块化:代码抽象、代码封装、代码复用、依赖管理

如果没有模块化,我们代码会怎样?

  • 变量和方法不容易维护,容易污染全局作用域
  • 加载资源的方式通过script标签从上到下
  • 依赖的环境主观逻辑偏重,代码较多就会比较复杂
  • 大型项目资源难以维护,特别是多人合作的情况下,资源的引入会让人崩溃

因此,需要一种将JavaScript程序模块化的机制,如

  • CommonJs (典型代表: node.js早期)
  • AMD (典型代表: require.js)
  • CMD (典型代表: sea.js)

应用场景:如今,ES6 模块化已经深入我们日常项目开发中,像 vue、react 项目搭建项目,组件化开发处处可见,其也是依赖模块化实现
 

11. 一个滚动 公告组件,如何在鼠标滑入时停止播放,在鼠标离开时继续等待滑入时得剩余等待时间后播放?

轮播图的定时滚动,一般是使用 setlnterval 实现。

可以监听轮播图的 mouseover 和 mouseout 事件,如果 mouseover 被触发,就清除定时轮播,并记录下一次轮播的剩余等待时间 xs,如果mouseout 被触发,就在 xs 的时间后立即进行切换,并且开启定时轮播。


当然其中的细节还比较多,比如 mouseover 的过程中手动切换了轮播图该怎么处理等等。

12. 遍历一个任意长度的Iist中的元素并依次创建异步任务,如何获取所有任务的执行结果?

看到这个题目,大家首先想到的是 Promise.all 或者 Promise.allSettled

  • Promise.all

需要传入一个数组,数组中的元素都是 Promise 对象。当这些对象都执行成功时,则 all 对应的 promise 也成功,且执行 then 中的成功回调。如果有一个失败了,则 all 对应的 promise 失败,且失败时只能获得第一个失败 Promise 的数据。

const p1 = new Promise((resolve, reject) => {resolve('成功')
})
const p2 = Promise.resolve('success')
const p3 = Promise.reject('失败')Promise.all([p1, p2]).then((result) => {console.log(result) // ['成功了','success']
}).catch((error)=> {//未被调用
})Promise.all([p1, p3, p2]).then((result) => {//未被调用
}).catch((error) => {console.log(error) //'失败'
});
  • Promise.allSettled

Promise.allSettled() 可用于并行执行独立的异步操作,并收集这些操作的结果。


Promise.allSettled() 方法返回一个在所有给定的promise都已经 fulfilled 或 rejected 后的promise,并带有一个对象数组,每个对象表示对应的promise结果。

Promise.allSettled([p1, p2, p3]).then(values => {console.log(values)
})

13. 给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡,请问会执行几次事件,然后会先执行冒泡还是捕获

addEventListener 绑定几次就执行几次

先捕获,后冒泡

14. 连续 bind() 多次,输出的值是什么?

var bar = function () {console.log(this.x);
}
var foo = {x:3
}
var sed = {x:4
}
var func = bar.bind(foo).bind(sed);
func();///var fiv = {x:5
}
var func = bar.bind(foo).bind(sed).bind(fiv);
func();///?

两次都输出3


在JavaScript中,多次 bind() 是无效的


更深层次的原因,bind() 的实现,相当于使用函数在内部包含了一个call/apply,第二次bind() 相当于再包住第一次 bind() ,故第二次以后 bind 是无法生效的

15. 移动端的点击事件有延迟,时间是多久,为什么会有?怎么解决这个延时

移动端点击有 300ms 的延迟,原因是移动端会有双击缩放的这个操作,因此浏览器再 click 之后要等待 300ms ,看用户有没有下一次点击,来判断这次操作是不是双击


有三种办法来解决这个问题:

  • 通过  meta 标签禁用网页的缩放
  • 通过 meta 标签将网页的 viewport 设置为 ideal viewport
  • 调用一些 js 库,比如 FastClick

click 延时问题还可能引起点击穿透的问题,就是如果我们在一个元素上注册了 touchStart 的监听事件,这个事件会将这个元素隐藏掉,我们发现当这个元素隐藏后,触发了这个元素下的一个元素的点击事件,这就是点击穿透

16. 如何实现一个扫描二维码登录PC网站的需求?

二维码登录本质上也是一种登录认证方式。既然是登录认证,要做的也就两件事情:

  • 告诉系统我是谁
  • 向系统证明我是谁

扫描二维码登录的一般步骤

  • 扫码前,手机端应用是已登录状态,PC端显示一个二维码,等待扫描
  • 手机端打开应用, 扫描PC端的二维码,扫描后,会提示“已扫描,请在手机端点击确认“
  • 用户在手机端点击确认,确认后PC端登录就成功了

具体流程:生成二维码>扫描二维码>状态确认


1. 生成二维码

  • PC端向服务端发起请求,告诉服务端,我要生成用户登录的二维码,井且把PC端设备信息也传递给服务端
  • 服务端收到请求后,它生成二维码旧ID,并将二维码ID与PC端设备信息进行绑定
  • 然后把二维码ID返回给PC端
  • PC端收到二维码ID后, 生成二维码(二维码中肯定包含了ID)
  • 为了及时知道二维码的状态,客户端在展现二维码后,PC端不断的轮询服务端,比如每隔一秒就轮询一次,请求服务端告诉当前二维码的状态及相关信息,或者直接使用websocket,等待在服务端完成登录后进行通知

2. 扫描二维码

  • 用户用手机去扫描PC端的二维码,通过二维码内容取到其中的二维码ID
  • 再调用服务端API将移动端的身份信息与二维码ID一起发送给服务端
  • 服务端接收到后,它可以将身份信息与二维码ID进行绑定,生成临时token。然后返回给手机端
  • 因为PC端一直在轮询二维码状态,所以这时候二维码状态发生了改变,它就可以在界面上把二维码状态更新为已扫描

3. 状态确认

  • 手机端在接收到临时token后会弹出确认登录界面,用户点击确认时,手机端携带临时token用来调用服务端的接口,告诉服务端,我已经确认
  • 服务端收到确认后,根据二维码|绑定的设备信息与账号信息,生成用户PC端登录的token
  • 这时候PC端的轮询接口,它就可以得知二维码的状态已经变成了 “已确认”。并且从服务端可以获取到用户登录的token
  • 到这里,登录就成功了,后端PC端就可以用token去访问服务端的资源了

17. 下面的代码执行后输出什么

for (var i = 1; i <= 5; i++){setTimeout(function timer() {console.log(i)},0)
}

结论:输出5个6


因为 setTimeout 为宏任务,由于 JS 中单线程 eventLoop 机制,在主线程同步任务执行完后才去执行宏任务,因此循环结束后,setTimeout 中的回调才依次执行,但输出 i 的时候当前作用域没有,往上一级再找,发现了 i ,此时循环已经结束,i 变成了6。因此会全部输出 6

18. 请对一下数组,根据 born 的值降序排列

const singers = [{ name: 'Steven Tyler', band: 'Aerosmith', born: 1948 },{ name: 'Karen Carpenter', band: 'The Carpenters', born: 1950 },{ name: 'Kurt Cobain', band: 'Nirvana', born: 1967 },{ name: 'Stevie Nicks', band: 'Fleetwood Mac', born: 1948 },
];

Array.prototype.sort() 方法用原地算法对数组的元素进行排序,并返回数组,在很多排序场景下推荐使用


解答:

const result = singers.sort((a, b) => {return a.born < b.born ? 1 : -1
})
console.log(result)

19. 使用 js 生成 -10000 的数组

实现的方法很多,除了使用循环(for, while, forEach等)外,最简单的是使用 Array. form

// 方法一
Array.from(new Array(10001).keys()).slice(1)// 方法二
Array.from({length:10000},(node,i) => i+1)

20. 实现以下转换,合并为连续的数字

[1, 2, 3, 4, 6, 7, 9, 13, 15] => ['1 -> 4 ', ' 6 -> 7', ' 9 ', ' 13 ', ' 15 ']


本题是一道比较简单的数组处理题目,主要有两个处理步骤:

  • 将超过一个的连续数字元素,合并成 x->y ,比如 [1,2,3,4] 转成 [ ' 1-> 4 ' ]
  • 将非连续的数字元素,转成字符串

具体的代码实现如下:

function shortenArray(arr) {// 处理边界if (!Array.isArray(arr) || arr.length <= 1) {return arr}//记录结果
const result = []//记录连续数字的开始位置
let start = 0
//记录连续数组的结束位置
let last = 0function pushArr(arrStart, arrEnd) {if (arrStart === arrEnd) {result.push(arr[arrStart].toString())} else {result.push(`${arr[arrStart]}->${arr[arrEnd]}`)}
}//一次循环获取结果
for (let i = 1; i < arr.length; i++){const temp = arr[i]if (arr[last] + 1 === temp) {last=1} else {pushArr(start, last)start = ilast = i}
}//处理必要剩余数据
pushArr(start, last)return result
}console.log(shortenArray([1, 2, 3, 4, 6, 7, 9, 13, 15]))

21. 使用Promise实现每隔1秒输出1,2,3

这道题比较简单的一种做法是可以用 Promise 配合着 reduce 不停的在 promise 后面叠加 .then,请看下面的代码:

const arr = [1, 2, 3]
arr.reduce((p, x) => {return p.then(() => {return new Promise(r => {setTimeout(() => r(console.log(x)), 1000)})})
}, Promise.resolve())

还可以更简单的写法:

const arr = [1, 2, 3]
arr.reduce((p, x) => p.then(() => new Promise(r => setTimeout(() => r(console.log(x)), 1000))));

22. js 关于元素属性的方法

js设置dom属性

  1. 修改属性:dom.setAttribute("属性名",“属性值")
  2. 获取属性:dom.getAttribute("属性名")
  3. 检查属性是否存在:dom.hasAttribute("属性名")  //true false
  4. 删除 DOM 结点中的自定义属性:removeAttribute("属性名")
  5. 获取 dom 的 class dom.classList 返回元素的 class 列表
    <div class="box content"></div>
    返回的是数组形式['box','content']
  6. 添加 dom 的 class: dom.classList.add("date");
  7. 判断当前 dom 有没有该 class 名:dom.classList,contains("box")
  8. 删除 class: dom.classList,remove("date");
  9. 设置 class 样式 dom.style, 属性名="属性值"dom.style,width="200px";

23. 说一说BOM和DOM

BOM,浏览器对象模型,最根本的是window,是为了操作浏览器出现的API,又 Window,History,Location,Navigator 等方法

DOM,文档对象模型,有各种事件方法,最根本的是 document,dom 的增删改查

24. JS 和 TS 的区别

区别:
1、TypeScript 中引入了JavaScript中没有的“类”概念
2、TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。
3、js 没有重载概念,ts 有可以重载
4、ts增加了接囗interface、泛型、类、类的多态、继承等
5、ts对比js基础类型上,增加了 void / never / any / 元组 / 枚举 / 以及一些高级类型


js 有的类型:boolean 类型、number 类型、string 类型、array 类型、undefined、null


ts 新增的类型:tuple 类型(元组类型)、enum 类型(枚举类型)、any 类型(任意类型)、void 类型(没有任何类型)表示定义方法没有返回值、never 类型:是其他类型(包括 null 和 undefined )的子类型,代表从不会出现的值这意味着声明 never 变量只能被never类型所赋值


js变量是没有类型的,即 age=18,age 可以是任何类型的,可以继续给 age 赋值为 age=aaa"
Ts有明确的类型(即:变量名:number (数值类型)) eg:let age:number=18

  • ts 需要静态编译,它提供了强类型与更多面向对象的内容
  • ts 最终仍要编译为弱类型,基于对象的原生的js,再运行。故 ts 相较 java / C# 这样天生面向对象语言是有区别和局限的
  • ts 是由微软牵头主导的,其语法风格与概念主要来自 C#,理解起来学过 java 的更容易理解(C# 我没学过)

ts优势
1、类型化思维方式,使开发更严谨,能帮助开发人员检测出错误并修改,提前发现错误,减少改 Bug 时间
2、类型系统提高了代码可读性,便于开发人员做注释,维护和重构代码更加容易
3、补充了接口、枚举等开发大型应用时 JS 缺失的功能
【JS的类型系统存在”先天缺陷”,绝大部分错误都是类型错误(Uncaught TypeError)】
4、TypeScript 工具使重构更变的容易、快捷。
5、类型安全功能能在编码期间检测错误,这为开发人员创建了一个更高效的编码和调试过程。

25. 异步执行的顺序

微任务在宏任务之前

同步任务 ——> promise.nextTick ——> promise.then ——> setTimeout ——> setInterval ——> setImmediate

26. 响应式布局

一、百分比布局

二、媒体查询

三、rem布局(根据HTML的font-size的大小来设置计算的)

四、vm布局

五、弹性盒子布局

27. 除webpack之外,还用过其他什么打包工具

vite,打包快,热更新快,不需要重复编译,环境配置比 webpack 简单

28. 泛型

指在定义函数/接口/类时,不预先指定具体的类型,而是在使用的时候再指定类型限制

29. 既然提到了history,说一说前端怎么实现路由改变但是不向服务器发送请求的

history.pushState() 路径发生变化,但是不向服务器发送请求

history.replaceState() 路径发生变化,不向服务器发送请求,只会改变浏览器地址栏中的地址,并将地址添加到历史记录中,实现客户端路由

30. ES6的map

Map是ES6新特性,一种新的集合类型

  1. Map对象存有键值对
  2. Map对象记得键的原始插入顺序
  3. Map对象具有表示映射大小的属性

31. 了解weakMap吗

  • 不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)
  • 对象不可枚举的,无法获取集合大小
  • 持有的是每个键对象的”弱引用”,这意味着在没有其他引用存在时垃圾回收能正确进行

32. BFC触发条件

  1. 根元素
  2. 浮动元素(元素得 float 不是 none)
  3. 绝对定位元素(元素的 position为 absolute 或 fixed)
  4. 行内块元素(元素的 display 为 inline-block)
  5. 表格标题(元素的 display 为 table-caption,HTML 表格标题默认为该值)
  6. 表格单元格(元素的 display 为 table-cell,HTML 表格单元格默认为该值)
  7. 匿名表格单元格(元素的display为table、table-row、table-row-group、table-header-group、table-footer-group 分别为默认或 inline-table)
  8. overflow值不为flex或 inline-flex 元素的直接子元素
  9. 弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
  10. 网格元素(display 为 grid 或 inline-grid 元素的直接子元素)

33. 开发者工具的network标签下,能看到https加密的内容吗?

能的。浏览器相当于是页面文件的操作系统,能对加密文本进行解密

34. 事件代理是怎么判断是哪一个子dom触发

通过 event.target 得到触发事件的目标

35. CSS3 新特性

  1. CSS3 选择器
  2. CSS3 边框与圆角
  3. CSS3 背景与渐变
  4. CSS3 过渡
  5. CSS3 变换
  6. CSS3 动画

36. 预处理器

一、什么是Less/Sass?
LESS 是一个 CSS 预处理器,可以为网站启用可自定义,可管理和可重用的样式表。LESS 是一种动态样式表语言,扩展了 CSS 的功能。LESS 也是跨浏览器友好。
SASS (Syntactically Awesome Stylesheet)是一个 CSS 预处理器,有助于减少 CSS 的重复,节省时间。它是更稳定和强大的 CSS 扩展语言,描述文档的样式干净和结构。


二、什么是css预处理器?
CSS预处理器是一种脚本语言Ω,可扩展CSS并将其编译为常规CSS语法,以便可以通过 Web 浏览器读取。它提供诸如变量,函数,
mixins和操作等功能,可以构建动态css.


三、sass,less,stylus优缺点?
Less 从语言特性的设计到功能的健壮程度和另外两者相比都有一些缺陷,但用 Less 可以满足大多数场景的需求。


但相比另外两者,基于 Less 开发类库会复杂得多,实现的代码会比较脏,能实现的功能也会受到DSL的制约。


比 Stylus 语义更清晰、比 Sass 更接近 CSS 语法,使得刚刚转用 CSS 预编译的开发者能够更平滑地进行切换。


Sass 在三者之中历史最久,也吸收了其他两者的一些优点。


从功能上来说 Sass 大而全,语义明晰但是代码很容易显得累赘。


主项目基于 Ruby 可能也是一部分人不选择它的理由(Less 开始也是基于 Ruby 开发,后来逐渐转到 less.js 项目中)。


Sass有一个‘事实标准库——Compass,于是对于很多开发者而言省去了选择类库的烦恼,对于提升开发效率也有不小的帮助。


Stylus的语法非常灵活,很多语义都是根据上下文隐含的。


基于 Stylus 可以写出非常简洁的代码,但对使用团队的开发素养要求也更高,更需要有良好的开发规范或约定。


总的来说,三种预处理器百分之七八十的功能是类似的。


Less适合帮助团队更快地上手预处理代码的开发,而 Sass 和 Stylus 的差异更在于口味。
 

37. vue computed的原理

computed 是 vue 中的计算属性,在依赖的值发生变化的时候进行重新计算,否则使用缓存。


而在面试中常被问及 computed 原理,这篇文章主要作为我学习computed源码的笔记。


前面说到 computed 只有在依赖发生变化才会重新计算,那么如何得知 computed 的值发生了变化呢


这主要是 Watcher 中的 dirty 属性,dirty 属性为 true 时,说明 computed 中的值需要重新计算,dirty 为 false 时,则说明依赖没有变化,不需要重新计算


当计算属性的值发生变化时,计算属性的 watcher 和组件的 watcher 都会得到通知。


计算属性的 watcher 会将 dirty 置为 true,组件的 Watche r得到通知,同样将 dirty 属性置为 false,重新计算值,用于本次渲染。


简单来说,computed就是定义在vm上的一个getter属性,这个getter属性被触发时会做两件事
1. 计算当前属性的值,此时会使用Watcher去观察计算属性中用到的所有其他数据的变化。同时将计算属性的 Watcher 的 dirty 属性设置为
false.
2. 当计算属性中用到的数据发生变化时,将得到通知从而进行重新渲染


Watcher中的 depend 和 evaluate 方法是专门用于实现计算属性的两个 API
 

38. 雪碧图和字体图标的区别

CSS雪碧图和字体图标对比情况如下

对比角度

CSS雪碧图

字体图标

做动画图片做动画较合适做动画的话,不如图片
高分辨率图片在高分辨率下会模糊字体图标是文字,受分辨率影响小
多色展示图片多色图片展示很好实现多色图标目前来看比较难实现
图标变换颜色或者其他效果需要换一个图片改变一下文字的color就好
文件体积图片体积较大字体图标体积较小
实现简单icon体积大、变化不灵活体积小,方便添加效果

39. 前端如何设置可以携带cookie

  • 对于 axios 同源请求会自动携带 cookie
  • 对于 jsonp 跨域请求也会自动携带 cookie
  • 对于 cors 跨域请求设置请求头 withCredential 为 true

40. CDN分发的原理

将资源分发到各个缓存服务器,请求资源的时候自动连接到包含此资源的最近的一台服务器

41. react 类继承 和 函数组件的差别?分别在什么情况下使用?

区别:内部状态 state,生命周期函数

场景一:如果一开始就知道这个组件需要用到 state 或者生命周期函数组件时,就直接选择类继承方式


场景二:如果一开始用不到这些特性的时候,可以先用函数式组件,组件需要用到这些也行的时候,再把它重构成类继承的方式

42. vue2 和 vue3 生命周期的区别

 vue2的生命周期
vue3的生命周期(按需引入)
beforeCreate()首先执行 setup()
created()

onBeforeMount()

beforeMount()onMounted()
mounted()onBeforeUpdate()
beforeUpdate()onUpdated()
updated()onBeforeUnmount()
beforeDestory()onUnmounted()
destoryed()

43. HTML指的是 超文本标识语言

44. 在方程的解 x1=2 中下标 “1” 在HTML中可以使用 <sub> 标记实现

45. 将超链接的目标网页在新窗口打开的方式是 -blank

46. 去掉无序列表项前面的符号的方法是 ul {list-style-type:none;}

47. CSS的全称是 Cascading Style Sheets

48. 下列能够设置文本加粗的CSS属性值是 font-weight: blod

49. 去掉文本超链接的下划线的方法是 a { text-decoration: none; }

50. web网页中支持哪几种方式来编写样式?

  • 行内样式:<style> 属性上
  • 内部样式:<style> 标签中
  • 外部样式:<link>   标签引入

更多推荐

前端八股文经验分享:面试拷打经历 与 知识总结(纯个人总结)(八)

本文发布于:2024-03-23 19:57:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1742197.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:经验   知识

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!