满分面试题
1 HTML5的语义化标签举例以及其好处?
语义化标签
<title>:页面主体内容。 <hn>:h1~h6,分级标题,<h1> 与 <title> 协调有利于搜索引擎优化。 <ul>:无序列表。 <li>:有序列表。 <header>:页眉通常包括网站标志、主导航、全站链接以及搜索框。 <nav>:标记导航,仅对文档中重要的链接群使用。 <main>:页面主要内容,一个页面只能使用一次。如果是web应用,则包围其主要功能。 <article>:定义外部的内容,其中的内容独立于文档的其余部分。 <section>:定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。 <aside>:定义其所处内容之外的内容。如侧栏、文章的一组链接、广告、友情链接、相关产品列表等。 <footer>:页脚,只有当父级是body时,才是整个页面的页脚。 <small>:呈现小号字体效果,指定细则,输入免责声明、注解、署名、版权。 <strong>:和 em 标签一样,用于强调文本,但它强调的程度更强一些。 <em>:将其中的文本表示为强调的内容,表现为斜体。 <mark>:使用黄色突出显示部分文本。 <figure>:规定独立的流内容(图像、图表、照片、代码等等)(默认有40px左右margin)。 <figcaption>:定义 figure 元素的标题,应该被置于 figure 元素的第一个或最后一个子元素的位置。 <cite>:表示所包含的文本对某个参考文献的引用,比如书籍或者杂志的标题。 <blockquoto>:定义块引用,块引用拥有它们自己的空间。 <q>:短的引述(跨浏览器问题,尽量避免使用)。 <time>:datetime属性遵循特定格式,如果忽略此属性,文本内容必须是合法的日期或者时间格式。 <abbr>:简称或缩写。 <dfn>:定义术语元素,与定义必须紧挨着,可以在描述列表dl元素中使用。 <address>:作者、相关人士或组织的联系信息(电子邮件地址、指向联系信息页的链接)。 <del>:移除的内容。 <ins>:添加的内容。 <code>:标记代码。 <meter>:定义已知范围或分数值内的标量测量。(Internet Explorer 不支持 meter 标签) <progress>:定义运行中的进度(进程)。
优点
代码结构清晰,方便阅读,有利于团队合作开发。
方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以语义的方式来渲染网页。
有利于搜索引擎优化(SEO)。
2 CSS3实现毛玻璃背景效果,怎么实现?
利用 css 新属性 backdrop-filter 可以很方便对元素背后的所有元素进行滤镜操作
例:backdrop-filter: blur(2px);
3 promise的原理?
Promise概述
- 是异步编程解决方案,本质上讲是callback的变相处理,使得代码更加优雅和可扩展;
- 异步发展过程:callback -> promise -> generator + co = async + await;
- 解决了异步的问题,但不能说Promise本身是异步的;
- 解决了回调地狱;
- 解决了多个并发请求并获得结果;
Promise的三种状态
- pending:等待状态;
- fulfiled:成功状态;
- rejected:失败状态;
Promise实现分析
- 如何管理Promise中的三种状态:初始的时候为pending,resolve后状态改为fulfiled,reject后为rejected,重要的是状态一旦发生变化后就不可更改;
- 如何实现then的返回值;
- 如何将Promise变成一个微任务;
promise是微任务,所以我们不能使用setTimeout,这里面我们可以使用postMessage;
代码实现
class AlleyPromise { // 1、Promise三种状态 static PENDING = 'PENDING'; static FULFILED = 'FULFILED'; static REJECTED = 'REJECTED'; constructor(callback) { // 容错处理 if(typeof callback !== 'function') { throw new TypeError('Promise resolver undefined is not a function') } // 初始状态 this.promiseStatus = AlleyPromise.PENDING; // 定义resolve函数队列 reject函数队列 this.resolveQueues = []; this.rejectQueues = []; //定义初始值 this.value; //调用callback函数 callback(this._resolve.bind(this), this._reject.bind(this)) } _resolve(val) { window.addEventListener('message',()=>{ // 更改成功状态 if(this.promiseStatus !== AlleyPromise.PENDING) return; this.promiseStatus = AlleyPromise.FULFILED; this.value = val; let handler; while(handler = this.resolveQueues.shift()){ handler(this.value) } }) window.postMessage('') } _reject(val) { window.addEventListener('message',()=>{ // 更改失败状态 if(this.promiseStatus !== AlleyPromise.PENDING) return; this.promiseStatus = AlleyPromise.REJECTED; this.value = val; let handler; while(handler = this.rejectQueues.shift()){ handler(this.value) } }) window.postMessage('') } then(resolveHandler,rejectHandler) { this.resolveQueues.push(resolveHandler) this.rejectQueues.push(rejectHandler) return new AlleyPromise((resolve,reject)=>{ resolve() }) } } // 测试 new AlleyPromise((resolve,reject) => { setTimeout(() => { resolve() }, 10); }).then(() => { console.log('then1'); // 后输出 }).then(() => { console.log('then2'); // 先输出 })
理解和使用Promise.all和Promise.race
4 async/await的使用方法理解?
async-await是promise和generator的语法糖。只是为了让我们书写代码时更加流畅,当然也增强了代码的可读性。简单来说:async-await 是建立在 promise机制之上的,并不能取代其地位。
基本语法 async function basicDemo() { let result = await Math.random(); console.log(result); } basicDemo(); // 0.6484863241051226 //Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined} 上述代码就是async-await的基本使用形式。有两个陌生的关键字async、await,同时函数执行结果似乎返回了一个promise对象。
5 HTTPS比HTTP安全在哪呢?
HTTPS 是我们常见的 HTTP 协议与某个加密协议的混合体,也就是 HTTP+S。这个 S 可以是 TLS(安全传输层协议)、也可以是 SSL(安全套接层),不过我更认可另一个抽象概括的说法,HTTP+Security。
6 快速排序和冒泡排序
冒泡排序和快速排序算法

浙公网安备 33010602011771号