侧边栏壁纸
博主头像
lac博主等级

行动起来,活在当下

  • 累计撰写 66 篇文章
  • 累计创建 12 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

面试杂记

Hude
2023-10-12 / 0 评论 / 0 点赞 / 22 阅读 / 6583 字

1.如何在不设置宽度和高度的情况下垂直将弹出窗口集中?

  • 方式一:通过设置固定定位fixed,然后距离顶部和左部的距离设置为50%,然后通过transform属性的translate值,调整元素自身的位置

element {
	position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
  • 通过flex布局结合固定定位,设置flex布局横向和纵向的元素位置为center,再通过设置fixed定位的上右下左为0

element {
	display: flex;
    justify-content: center;
    align-items: center;
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}

2.如何确定一个对象是不是数组?

  • instanceof 关键字

  • 检测是否是同一条原型链上的原型: Array.prototype.isPrototypeOf(element)

  • Array对象的isArray方法: Array.isArray(element)

  • Object对象的toString方法:Objcet.prototype.toString.call(element),返回对象的字符串形式

3.分别使用ES5和ES6实现类继承和方法重写

//ES5
function Parent (name) {
	this.name = name;
}
function Child (name,type) {
	Parent.prototype.call(this);
	this.type = type;
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.contructor = Child;

// ES6
class P {
	constructor(name){
		this.name = name;
	}
}
class C extends P {
	constructor(name,age){
		super(name);
		this.age = age;
	}
}

4.操作数组的常用方法

  • 合并两个数组

const arr1 = [1,2,3];
const arr2 = [4,5,6];
// 使用concat()方法
arr1.concat(arr2);// 新数组
// 使用splice()方法
arr1.splice(arr1.length,0,...arr2)
// 使用延展操作符
[...arr1,...arr2]
// 使用push()方法
arr1.push(...arr2);
  • 数组去重

// 使用set集合
[...new Set(arr)]
// 使用filter()方法
arr.filter((value,index,self)=>self.indexOf(value) === index);
// 使用累加器方法reduce
 arr.reduce((accumulator, currentValue) => {
  if (!accumulator.includes(currentValue)) {
    accumulator.push(currentValue);
  }
  return accumulator;
}, []);// 空数组是第二个参数,表示累加器的初始值
  • 数组比较

//使用filter()方法
arr.filter((value,index)=> value > 5);
  • 最值计算

// sort()方法
let max = arr.sort()[arr.length-1];
let min = arr.sort()[0];
// Math.max/Math.min方法
let max = Math.max(...arr);
let min = Math.min(...arrr);

5.跨域的几种解决方案

  • 第一种方式:jsonp请求;jsonp的原理是利用<script>标签的跨域特性,可以不受限制的从其他域中加载资源,类似的标签还有<img>。一些诸如JQuery的外部脚本库也是使用jsonp实现跨域的

  • 第二种方式:通过设置 document.domain 属性为相同的父域名来启用跨子域通信,这种方式用在主域名相同子域名不同的跨域访问中。需要注意的是,document.domain 属性只能设置成当前域名的父域名或同一个域名,不能设置为其他域名,这是为了防止滥用跨域通信的风险。同时,设置 document.domain 属性只能在两个页面中的任意一个中进行,而且必须在加载页面的初始 HTML 中设置,否则会被浏览器拒绝

  • 第三种方式:Window.name;window的name属性有个特征:在一个窗口(window)的生命周期内,窗口载入的所有页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置

  • 第四种方式:window.postMessage是html5中实现跨域访问的一种新方式,可以使用它来向其他的window对象发送消息,无论这个window对象是属于同源还是不同源

  • 第五种方式:CORS;CORS背后的基本思想,就是使用自定义的HTTP头部让浏览器于服务器进行沟通,从而决定请求或响应式应该成功还是失败

  • 第六种方式:WebSockets是一种在单个TCP上进行全双工通讯的协议,本身就不受同源策略的限制

6.如何中止一个正在发送的请求AbortController API

创建AbortController实例,对请求参数或者promise绑定好signal后,可以通过实例的abort()方法中止

7. http1和http2的区别

  • 连接复用:http1.1每次请求都会创建一个TCP连接,频繁的握手挥手,性能不好,http2创建连接后可以复用同一个连接进行多次请求传输

  • 头部压缩:http1.1的请求与响应的头部信息都需要重复发送,包含大量冗余信息,http2采用HPACK压缩了头部信息,减少了传递的数据量

  • 服务器推送:http1.1客户端需要发送请求才能获得响应数据,无法从服务端单向推送数据,http2可以直接从服务端推送数据到客户端

  • 流控制:http1.1依赖TCP的滑动窗口机制来实现流控制,本身没有流控制的能力,而http2本身就实现了流控制机制,自身是有流控制能力的

  • 优先级:http1.1请求优先级由到达的顺序决定,无法对请求进行优先级排序,http2可以给请求设置优先级,可以根据请求的重要程度进行排序,确保关键资源的高优先级

3. 设置跨源资源共享(CORS)请求的请求头属性 4. 优化白屏如何计算

0

评论区