算法手写题(数组扁平化flat)
已知如下数组,编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序。且不重复的数组
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
//Array.from 将set转换为数组
//new Set //创建一个set对象用于数组去重
//arr.flat(infinity) 数组不限维数扁平化
//sort 排序 a>b才需要交换顺序 即从小到大排列
return Array.from(new Set(arr.flat(infinity))).sort((a,b)=>{return a-b})
//array.flat(Infinity)方法实现:
Array.prototype.flat = (depth)=>{ //depth==inifity时无限递归到没有子元素数组为止,不用depth--
var arr = []
this.forEach(item=>{
if(Array.isArray(item)&&depth){
arr = arr.concat(item.flat(depth--)) //递归子元素数组
}
else{
arr.push(item)
}
})
return arr
}
JS 异步解决方案的发展历程以及优缺点
Promise 构造函数是同步执行还是异步执行,那么****then 方法呢?
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4)
执行结果是:1243,promise构造函数是同步执行的,then方法是异步执行的
如何实现一个 new
1、创建一个新的对象
2、把obj的__proto__指向fn的prototype,实现继承
3、改变this的指向,执行构造函数、传递参数,fn.apply(obj,) 或者 fn.call()
4、返回新的对象obj
function _new(fn,args){ //fn代表要继承的类或者构造函数
var obj = {} //创建对象
obj._proto_ = fn.prototype //把obj的__proto__指向fn的prototype,实现继承
fn.apply(obj,args) //调用构造函数并把this指向obj,obj就拥有了fn里面的所有方法
return obj
}
简单讲解一下 http2 的多路复用
概念:
谈谈你对 TCP 三次握手和四次挥手的理解
TCP三次握手:
1、客户端发送syn包到服务器,等待服务器确认接收。
2、服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端。
3、客户端确认接收服务器的syn+ack包,并向服务器发送确认包ack,二者相互建立联系后,完成tcp三次握手。
四次挥手就是中间多了一层:等待服务器再一次响应回复相关数据的过程。
三次握手之所以是三次是保证client和server均让对方知道自己的接收和发送能力没问题而保证的最小次数。
第一次client => server 只能server判断出client具备发送能力
第二次 server => client client就可以判断出server具备发送和接受能力。此时client还需让server知道自己接收能力没问题于是就有了第三次
第三次 client => server 双方均保证了自己的接收和发送能力没有问题
其中,为了保证后续的握手是为了应答上一个握手,每次握手都会带一个标识 seq,后续的ACK都会对这个seq进行加一来进行确认。
sync包:协议版本,随机数加密密钥,加密方法rsa,压缩方法,req
ask包:多了服务器证书
TCP四次挥手:
客户端发送fin信号,告诉服务器需要断开连接,等待服务器响应.
服务器接收到fin信号并确认,回应等待数据发送完成请求,发送ack包(失败可以重新发送).
服务器数据传输完毕,发送给客户端确认信息,等待客户端响应,如响应,则服务端直接关闭.
客户端收到响应,并确认信息,然后再次发送ack包给服务端,并进入time_wait状态,等待2MSL(最大报文生存时间)后,没有响应,则直接关闭.
MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN(服务端没收到ack),那么Client推断ACK已经被成功接收,则结束TCP连接。等待的作用就是防止服务端没收到ack消息发送失败的情况。
A、B 机器正常连接后,B 机器突然重启,问 A 此时****处于 TCP 什么状态
React 中 setState 什么时候是同步的,什么时候是异步的
React setState 笔试题,下面的代码输出什么?
class Example extends React.Component {
constructor() {
super()
this.state = { val: 0 }
}
componentDidMount() {
this.setState({ val: this.state.val + 1 })
console.log(this.state.val) // 第 1 次 log
this.setState({ val: this.state.val + 1 })
console.log(this.state.val) // 第 2 次 log
setTimeout(() => {
this.setState({ val: this.state.val + 1 })
console.log(this.state.val) // 第 3 次 log
this.setState({ val: this.state.val + 1 })
console.log(this.state.val) // 第 4 次 log}, 0)
},0)
}
}
答:0, 0, 2, 3
解析:外层的this.setState是异步的,且异步的setState会合并,因此前两次合并为一次setState,
因为是异步所以都是0,而setTimeout中的setState是同步的,且拿到的最新的state为1,然后同步执行
两次加1操作变成2和3