实现一个观察者模式
实现一个基础当观察者模式,当被观察者变动当时候,通知观察者.
1 | class Observer { |
记一次域名解析问题
介绍下重绘和回流
有以下3个判断数组的方法,请分别介绍它们之间的区别和优劣
有以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
个人题解
1、Object.prototype.toString.call(),是使用原型上的toString()方法,输出为[Object xxxxx],通过xxxxx的内容判断当前的类型.目前大部分判断类型都是基于此方法,比较准确
1 | console.log(Object.prototype.toString.call([1, 2, 3])); //[object Array] |
2、instanceof是基于原型链的判断方法,一个数组会找到他的原型是不是属于array,如果是返回true
1 | let fsimpleStr = "This is a simple string"; |
3、Array.isArray(),Array对象上提供的判断是否是数组的方法,比较准确
1 | Array.isArray([1, 2, 3]); |
相关链接
第 21 题:有以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
MDN isArray
MDN instanceof
如何实现a=1a=2a=3
谈谈你对TCP三次握手和四次挥手的理解
简单讲解一下http2的多路复用
简单讲解一下http2的多路复用
个人理解
不会
最高赞题解
在 HTTP/1 中,每次请求都会建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive ,解决了多次连接的问题,但是依然有两个效率上的问题:
第一个:串行的文件传输。当请求a文件时,b文件只能等待,等待a连接到服务器、服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是1秒,那么a文件用时为3秒,b文件传输完成用时为6秒,依此类推。(注:此项计算有一个前提条件,就是浏览器和服务器是单通道传输)
第二个:连接数过多。我们假设Apache设置了最大并发数为300,因为浏览器限制,浏览器发起的最大请求数为6,也就是服务器能承载的最高并发为50,当第51个人访问时,就需要等待前面某个请求处理完成。
HTTP/2的多路复用就是为了解决上述的两个性能问题。
在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。
帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
结论
不会
参考
第 15 题:简单讲解一下 http2 的多路复用 #14
http1.1 与 http2 对比
HTTP/2 相比 1.0 有哪些重大改进?
HTTP/2 资料汇总
如何实现一个 new
如何实现一个new
个人题解
1 | function Demo(a, b) { |
- 试了好一会试出来的
- 一直用prototype方法不行,挠头….
- proto 这个方法记得不是标准写法
- 标准写法是contructor prototype?看答案吧
最高赞题解
1 | function _new(fn, ...arg) { |
先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了
- 首先创建一个空的对象,空对象的proto属性指向构造函数的原型对象
- 把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象
- 如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象
结论
- proto 不是标准对象,使用
Object.create(fn.prototye)
创建原型对象 - 需要判断传入的对象是不是null或者undefined来判断是否返回实例对象
- 不需要使用必包的方式进行返回(单例模式或许可以)
相关链接
斐波那契额数列第n位
斐波那契额数列第n位 算法题
个人题解
递归的方式
1 | function fibonacci(n) { |
结论:
- 运行时间为1360ms左右,性能比较差
- 到45位的时候计算时间已经是15s
递归的方式,加一层缓存
1 | function fibonacci(n, cache) { |
结论:
- 第5000位的时候是9ms,此时数值已经是超过js最大数值,为Infinity
- 9000位左右递归栈会爆掉
循环的方式
1 | function fibonacci(n) { |
结论:
- 性能最佳,5000位约7毫秒
总结
- 递归一般情况下性能比普通循环要低
- 递归可能会爆栈
- 除非必须要递归的方式、其他方案成本过高、能确定递归次数较少,不然不建议用递归
- 某些文档提到尾递归可以提高性能,但是这个斐波那契额数列,没有找到使用尾递归的方式,单独开一篇尾递归的内容