总结牛客前端工程师精选面经合集(三)

简介: 总结牛客前端工程师精选面经合集(三)

2021-9-19


promise


Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。


通过promise实现图片懒加载


定义一个flag来确地图片是否加载完毕。


new Promise((resolve, reject) => {
    const image = new Image();
    image.src = '图片的真实地址'
    // 图片加载成功
    image.onload = () => {
     // 传出true表示图片加载完毕
     resolve(true)
    }
    // 
    image.onerror = () => {
       reject(false);
     };
    })
    // 外部接收到flag来做相应的处理。


返回一个异步操作,promise状态由谁决定


由后者决定


// 该例的状态由p1决定。
const p1 = new Promise(function (resolve, reject) {
  setTimeout(() => reject(new Error('fail')), 3000)
})
const p2 = new Promise(function (resolve, reject) {
  setTimeout(() => resolve(p1), 1000)
})
p2
  .then(result => console.log(result))
  .catch(error => console.log(error))


Promise一些静态方法


all


方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。


参数必须是具有 Iterator 接口,且返回的每个成员都是 Promise 实例。


该方法如果传入的promise实例都被resolve后才会将状态改变为fulfilled,只要有一个实例被reject后,他就被rejected,然后返回第一个被reject的实例。


race


方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。


如果传入的promise实例,有一个状态改变,那么promise.race的状态也随之改变,这个就好像赛跑一样,那一个promise的实例的状态先改变,promise.race的实例也随之改变。


该方法的作用是控制网络加载时长,如果到时见还没有加载完毕,就将他的状态变为rejected


const p = Promise.race([
  fetch('/resource-that-may-take-a-while'),
  new Promise(function (resolve, reject) {
    setTimeout(() => reject(new Error('request timeout')), 5000)
  })
]);
p
.then(console.log)
.catch(console.error);


allSettled


用来确定一组异步操作是否都结束了(不管成功或失败)。


一旦发生状态变更,状态总是fulfilled,不会变成rejected


then方法接收的参数与promise实例传入的顺序相对应。是promise的实例改变状态传入的参数。


  • 成功时: {status:‘fulfilled’, value:成功时传入的参数}


  • 失败时: {status:‘rejected’, reason: 失败时传入的参数}


any


方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。


该方法与all方法对应。


只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。


手写promise


建议看一下b站视频


www.bilibili.com/video/BV1AA…


www.bilibili.com/video/BV1sZ…


juejin.cn/post/685003…


简单的promise实现后,为什么异步任务不能准确执行呢?因为异步后,他的状态还没有从pending改变


怎么解决上述问题?当调用then方法的时候,当状态还是pending时,我们需要将回调函数传入各自的事件数组中(fulfilledArr, rejectedArr)。然后当异步调用resolve或者reject函数后,我们再调用相应的事件数组中的函数。 这里看是逻辑很奇怪,如果我们为调用then方法,那么事件数组中将没有事件,不会被调用,如果调用了then方法,那么如果是异步执行,我们将在resolve或者reject函数中执行传入的回调函数。


2021-9-20


html 的标签有哪些?(说的越多越好)


块级元素


若不设置宽度和高度 ,则宽度默认为父级元素的宽度(100%),高度根据内容大小自动填充。


常见的块级元素: div, p, form, table, hr, h1-6, dl, dt, dd(定义列表、列表中的项目、列表中项目的描述), ol, ul, li。


行内元素


行内元素只能容纳文本或者其他行内元素(a特殊,链接中不可再放链接),不可在其中嵌套其他块级元素


可以设置水平方向的padding和margin。并且可以设置垂直方向上的padding。


常见的行内元素:a, b, em, i, span, strong。


行内块元素


img, input。


空标签:<br />、<hr />、 <img />、 <input />、<area />、 <base />、 <link />、 <meta />。


html 公共属性有哪些?还有自定义属性?


基本属性


class: 定义类规则或样式规则 id: 定义元素的唯一标识 style: 定义元素的样式声明。

但是下面这些元素不拥有基本属性style,但是可以通过id,style获取:


  • html、head 文档和头部基本结构


  • title 网页标题


  • base 网页基准信息


  • meta 网页元信息


  • param 元素参数信息


  • script、style 网页的脚本和样式


公共属性


class:为元素设置类标识,多个类名用空格分开,CSS和JavaScript的可通过类属性获取元素


contenteditable:指定元素内容是否可编辑。这个元素可以被继承。


contextmenu:自定义鼠标右键弹出菜单内容。这个属性浏览器不支持


data- *:为元素增加自定义属性


dir:设置元素文本方向


draggable:设置元素是否可拖拽。选中元素,实现元素的拖拽。链接和图片默认是可以拖拽的。


dropzone:设置元素拖放类型:复制,移动,链接


hidden:表示一个元素是否与文档。样式上会导致元素不显示,但是不能用这个属性实现样式效果


id:元素id,文档内唯一


lang:元素内容的的语言


spellcheck:是否启动拼写和语法检查


style:行内css样式


tabindex:设置元素可以获得焦点,通过tab可以导航


title:元素相关的建议信息


translate:元素和子孙节点内容是否需要本地化


form 表单如何进行提交?


通过action属性提供提交的地址


普通提交时:必须指定提交的name和value。get提交:他上传的数据有限制,虽然url长度是没有限制的,但是服务器会自动屏蔽过长的url。


文件提交时:enctype="multipart/form-data", method=“post”。后端通过ctx.request.files拿到上传的文件。


enctype: application/x-www-form-urlencoded(默认)


"multipart/form-data"(文件上传)


“text/plain"


前端如何获取上传的文件:获取文件dom,然后dom.files获取文件数组。


前端如何将file转化为base64格式?


//file为一个文件对象。并且是Blob接口的对象。
function toBase64(file) {
  // 创建一个读取文件对象
  let render = new FileReader()
  // 监听读取完成
  render.onload = (e) => {
    // result为base64字符串
    let base64Image = e.target.result;
    render = null;//内存回收
  }
  render.readAsDataURL(file)
}


介绍下 iframe,它有哪些优点和缺点


blog.csdn.net/baxiadsy_cs…


HTML内联框架元素表示嵌套的browsing context。它能够将另一个HTML页面嵌入到当前页面中。


处理过哪些 css 兼容性问题?


不同浏览器的默认样式存在差异,所以需要css初始化,可以通过css初始化库Normalize.css


浏览器私有属性来对css属性进行兼容:对于书写顺序一定要注意,兼容性写法放到前面,把标准写法放到最后


  • -moz-代表firefox浏览器私有属性


  • -ms-代表IE浏览器私有属性


  • -webkit-代表chrome、safari私有属性


  • -o-代表opera私有属性


具体的兼容性问题:juejin.cn/post/684490…


详细说一下闭包和箭头函数,闭包和箭头函数分别解决了什么问题?


闭包


设置私有变量和方法


设置块级作用域。通过立即执行函数。


外部读取函数内部变量,让这些变量的值始终保持在内存中。



箭头函数


该函数没有自己的this。他的this是在函数编译的时候确定的,指向上一层函数中的this。


介绍一下 event loop,宏任务微任务


js是单线程的,同一时间只能做一件事情,可以通过event loop来提高执行效率。


js执行器:先执行主线程的代码。遇见异步任务,将他们分别放在event loop中,但是异步任务还可以细分为微任务与宏任务。当主线程空闲,就会去event loop中调用任务到主线程执行。然后不断重复此操作。


宏任务:


  • script (可以理解为外层同步代码)


  • setTimeout/setInterval


  • UI rendering/UI事件


  • postMessage、MessageChannel


  • setImmediate、I/O(Node.js)


微任务:


  • Promise.then()


  • MutaionObserver


  • Object.observe(已废弃;Proxy 对象替代)


  • process.nextTick(Node.js)(这个Api是介于宏任务和微任务队列之间)


vue 异步加载的方式


组件的异步加载


  • 通过Suspense


  • 通过defineAsyncComponent()。该方法可以传入一个返回promise的函数,也可以传入一个对象。其中当和Suspense组件一起使用的时候,suspensible:false时,表示将使用自己的过度,错误等组件、如果设置为true,将忽略自身的过度,错误等组件,来使用suspense组件的过度组件。


  • 路由的动态导入:通过weboackChunkName注释来指定异步块的包名称,如果指定的名称相同,我们将把他们打包到一个异步块。


  • import()函数返回一个promise对象。


vue中的异步API


  • nextTick: 当页面渲染完毕后,执行,返回一个promise对象。


相关文章
|
关系型数据库 MySQL 数据库
n8n自动化工具部署与使用
n8n是一款开源的工作流自动化工具,类似于IFTTT。它的优点是开源、可以自托管、下载安装方便、易于使用,可以互联上百种服务。n8n基于节点能够将任何工具连接在一起,轻松部署不同类型的任务。它可以做很多事情,比如:从数据库中获取数据后下载为excel然后通过邮件发送给其他人。
10327 1
|
Go
golang run时报undefined错误【已解决】
golang run时报undefined错误【已解决】
3841 0
golang run时报undefined错误【已解决】
|
8月前
|
人工智能
Chain of Draft: 借鉴人类草稿思维让大型语言模型更快地思考
本研究探讨了大型语言模型(LLMs)在复杂推理任务中的计算资源消耗与响应延迟问题,特别是思维链(CoT)提示范式的效率局限性。为解决这一问题,研究引入了Chain of Draft (CoD) 方法论,通过生成简洁、高信息密度的中间输出,模拟人类认知过程。CoD将每步限制在五个单词以内,减少冗余表达,显著降低token消耗和计算成本,同时保持或提升推理准确性。实验结果显示,CoD在多种推理任务中表现出色,大幅减少了token使用量(仅为CoT的7.6%),缩短了响应时间,提升了LLM在实际应用中的效率与实用性。
204 14
Chain of Draft: 借鉴人类草稿思维让大型语言模型更快地思考
|
5月前
|
存储 编解码 Prometheus
大模型推理加速实战:vLLM 部署 Llama3 的量化与批处理优化指南
本文详解如何通过量化与批处理优化,在vLLM中高效部署Llama3大模型。涵盖内存管理、推理加速及混合策略,提升吞吐量并降低延迟,适用于大规模语言模型部署实践。
1403 2
|
11月前
|
人工智能 前端开发 API
基于agentscope的多智能体游戏场景-骗子酒馆
骗子酒馆是一款基于多智能体系统的在线社交推理游戏,玩家通过掷骰子和扑克牌进行智力和心理博弈,结合大语言模型技术,每个游戏角色由AI扮演,具备独特的性格和决策逻辑,提供高度沉浸式的体验。游戏采用黑板通信模式,确保信息高效交换,支持多种角色如胆小鬼、占卜师等,每个角色拥有特定的技能和行为模式,增强游戏的策略深度和互动性。游戏界面简洁,操作流畅,适合喜欢心理战和策略游戏的玩家。文章末尾有源码和体验地址。
1470 13
|
9月前
|
人工智能 编解码 语音技术
SpeechGPT 2.0:复旦大学开源端到端 AI 实时语音交互模型,实现 200ms 以内延迟的实时交互
SpeechGPT 2.0 是复旦大学 OpenMOSS 团队推出的端到端实时语音交互模型,具备拟人口语化表达、低延迟响应和多情感控制等功能。
2081 21
SpeechGPT 2.0:复旦大学开源端到端 AI 实时语音交互模型,实现 200ms 以内延迟的实时交互
|
存储 人工智能 搜索推荐
[AI Mem0] 结合Mem0编写有状态AI应用,让应用更智能、更个性化
[AI Mem0] 结合Mem0编写有状态AI应用,让应用更智能、更个性化
|
存储 网络安全 API
|
机器人 API UED
Gradio 流式输出教程
本文是Gradio流式输出教程,介绍了如何通过Gradio的Blocks API实现聊天机器人的流式文本输出,包括两个示例:一个简单的ChatBot流式输出示例和一个更复杂的输入处理与输出分离的流式输出示例,旨在改善用户体验并为实时处理积累技术。
Gradio 流式输出教程
|
NoSQL MongoDB 关系型数据库
13个Mongodb GUI可视化管理工具,总有一款适合你
本文介绍了13个好用的MongoDB可视化工具。Robomongo,MongoDB Compass,phpMoAdmin等
113752 0
13个Mongodb GUI可视化管理工具,总有一款适合你

热门文章

最新文章