Codog

关注微信公众号:Codog代码狗

0%

堆,即完全二叉树,按左右节点顺序填充,可以不完整,但必须按顺序

比如 [1, 2, 3], [1, 2, 3, 4, 5]

最小堆与最大堆:

所有节点的左右子节点都大于等于当前节点的为最小堆,反之,所有节点的左右子节点值都小于等于当前节点值为最大堆。

最小堆:
image

最大堆:
image

最值问题

比如最大的第K个元素

新建大小为K的最小堆,遍历完成后,返回堆顶的元素即位最大的第K个元素(通俗掉就是第K大的元素)。

1
2
3
4
5
6
7
8
Q:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

A:
最小堆,堆大小为k,返回heap.pop()

[3,2,1,5,6,4]. => [5, 6] => 5

instanceof

原型链:

image

1
2
3
4
5
6
7
8
9
10
function myInstanceof(a, b) {
let p = a;
while (p) {
if (p === b.prototype) {
return true
}
p = p.__proto__
}
return false
}

测试一下:

1
2
3
4
5
6
7
8
myInstanceof([], Array)
true

myInstanceof([], Object)
true

myInstanceof({}, Array)
false

new

MDN上关于new的操作:

  1. 创建一个空的简单JavaScript对象(即{});
  2. 为步骤1新创建的对象添加属性proto,将该属性链接至构造函数的原型对象 ;
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this。

我们的函数也可以按照这个步骤来:

1
2
3
4
5
6
7
8
9
10
11
12
13
function myNew(Constructor, ...args) {
// 1. 创建空对象
const obj = {};

// 2. 添加原型
obj.__proto__ = Constructor.prototype;

// 3. 调用构造函数,并指定this
const res = Constructor.apply(obj, args);

// 4. 如果构造函数返回为对象则使用之,否则返回本地对象。
return typeof res === 'object' ? res : obj;
}

测试一下:

image

参考:https://javascript.plainenglish.io/implement-javascripts-new-operator-yourself-a-killer-frontend-interview-question-68468ad0a227

面试也会问一些框架相关的问题,初级的比如基本使用、常见的问题,中高级的会问一些优化方法,实现原理,不过不会问太多,了解些常见的即可。

阅读全文 »

这个问题也很经典,本人在18年的时候被问到过,当时第一次遇到经一位面试官解释后有了了解,以一个场景来说就是旧版本手机浏览器在触发click事件会有300ms左右的延迟,这个是故意而为之,当时会导致的问题一个就是体验不好,另一个就是点击穿透(比如手点击了上层,这时我通过代码手段隐藏了上层元素,300ms后,下层元素则会响应这个click事件)。

值得注意的是到现在大多数浏览器已经在内部优化了,比如Chrome

阅读全文 »