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可以给请求设置优先级,可以根据请求的重要程度进行排序,确保关键资源的高优先级
评论区