满分面试题

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 快速排序和冒泡排序

冒泡排序和快速排序算法

 

posted @ 2022-02-28 02:10  这是一个寂寞的天  阅读(41)  评论(0)    收藏  举报