前端面试-js绑定-async await与promise

  1. js如何实现绑定的?
  2. 浏览器的缓存机制?
  3. session和cookie的区别?
  4. promise了解吗?
  5. 接上题,async await和promise的区别?
  6. 宏任务微任务了解吗?promise是什么任务,settimeout呢?
  7. 常见的http状态码,分组说一下,然后用过哪些状态码?
  8. css权重?
  9. 盒模型,flex盒
  10. 手写代码题:css居中
  11. http、https有什么区别?

01js如何实现绑定的?

可以使用applay,call,bind方法实现this的绑定

apply()的第一个参数是null,在非严格模式下,第一个参数为null或者undefined时会自动替换为指向全局对象,apply()的第二个参数为数组或类数组。

该方法在函数被借用时,会立即执行,

var max = Math.max.apply(null, [1, 2, 3, 4, 5]);
console.log(max); // 输出5

call()是apply的语法糖,作用和apply()一样,同样可实现继承,唯一的区别就在于call()接收的是参数列表,而apply()则接收参数数组。

var max = Math.max.call(null, 1, 2, 3, 4, 5);
console.log(max); // 输出5

bind()的作用与call()和apply()一样,都是可以改变函数运行时上下文,区别是call()和apply()在调用函数之后会立即执行,而bind()方法调用并改变函数运行时上下文后,返回一个新的函数,供我们需要时再调用。

var person = {
    
    
  name: 'person',
  getName: function() {
    
    
    return this.name;
  }
}
var boy = {
    
    
   name: 'oldCode'
}
// bind()返回一个新函数,供以后调
var getName = person.getName.bind(boy);

// 现在调用
console.log(getName());    // 输出oldCode

02浏览器的缓存机制

浏览器的缓存主要分为两类:强缓存和协商缓存

强缓存
浏览器在发起http请求时首先检查的就是强缓存,该缓存机制中是不需要发送请求的,主要是通过携带字段确认实现

如果在检查中强缓存失效了,则会发起请求,进入到协商缓存。

协商缓存
在强缓存失效后,浏览器会在请求头中携带缓存tag向服务器发起请求,服务器根据该tag值去判断是否使用缓存,其中tag字段分为Last-Modified和Etag

缓存位置
浏览器的缓存位置共有四种,按照优先级来说分别为:

  • Service Woker
  • Memory Cache
  • Disk Cache
  • Push Cache

Service Worker

它是使Js运行在主线程之外,虽然自己脱离了浏览器,无法访问dom元素,但是它可以实现离线缓存,消息推送等,其中离线缓存就是指Service Woker Cache,同时它也是PWA实现的重要机制。

Memory Cache
它是指内存缓存,它的效率是最快的,但是它的生命周期很短,当渲染进程结束后,它也就不复存在了。

Disk Cache
它是指硬盘缓存,它的存取效率会慢一些,但是它的存储容量和存储时长相对比较有优势。

03session和cookie的区别?

cookie:
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。

session:

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
  • 单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
  • 将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

04promise了解吗?

Promise 是异步编程的一种解决方案:表示一个异步操作的最终状态以及返回的值;

从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。

promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

promise的用法:

一个Promise必须提供一个 then 方法以访问其当前值、终值和据因。

promise.then(onFulfilled, onRejected)回调函数只能执行一次,且返回 promise 对象

Promise的每个操作返回的都是Promise对象,可支持链式调用。

通过 then 方法执行回调函数,Promise的回调函数是放在事件循环中的微队列。

function fn(){
    
    
     return new Promise((resolve, reject)=>{
    
    
         成功时调用 resolve(数据)
         失败时调用 reject(错误)
     })
 }
 fn().then(success, fail).then(success2, fail2)
Promise.all 用法

**Promise.all()**方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

promise1和promise2都成功才会调用success1

Promise.all([promise1, promise2]).then(success1, fail1)

Promise.race 用法

Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

promise1和promise2只要有一个成功就会调用succ ess1

promise1和promise2只要有一个失败就会调用fail1;

总之,谁第一个成功或失败,就认为是race的成功或失败。

 Promise.race([promise1, promise2]).then(success1, fail1)

promise的缺点:不能取消,

05async await和promise的区别?

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大,简单地说,Promise好比容器,里面存放着一些未来才会执行完毕(异步)的事件的结果,而这些结果一旦生成是无法改变的
async 和await也是异步编程的一种解决方案,他遵循的是Generator 函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个Promise对象。

使用async函数可以让代码简洁很多,不需要像Promise一样需要些then,不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。
两者的区别
Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。

async await与Promise一样,是非阻塞的。

async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

所有的面试题以及答案都整理到这个公众号了,欢迎一起交流
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/buruyang/article/details/112297280