zhaofeihao / no-cross-no-crown

Nothing so bad, as not to be good for something.
MIT License
5 stars 1 forks source link

[面经]-[京东]-[京东国际站]-[2020.03.27] #17

Open zhaofeihao opened 4 years ago

zhaofeihao commented 4 years ago

1. 输出顺序

console.log('1');

setTimeout(function() {
    console.log('2');
    new Promise(function(resolve) {
        console.log('3');
        resolve();
    }).then(function() {
        console.log('4')
    })
})

new Promise(function(resolve) {
    console.log('5');
    resolve();
}).then(function() {
    console.log('6')
})
console.log('7')
setTimeout(function() {
    console.log('8');

    new Promise(function(resolve) {
        console.log('9');
        resolve();
    }).then(function() {
        console.log('10')
    })
})

2. 写垂直居中布局

3. 说一下浏览器事件机制

4. 实现new

5. 讲解http1.1 、http2.0、https

6. ES6 新特性

7. 讲解 promise

8. useState \ useEffect 讲解

写一个useEffect,只在componentDidMount 执行

9. 如何设计一个 dialog 组件

10. react是如何进行 diff 的

如何diff一个react组件 render函数的作用 diff有什么问题 讲解fiber

10. 网页性能优化

11. webpack

tree shaking 机制 tree shaking 存在的问题 css也有tree shaking,是用什么插件做的 webpack从1.0 到 4.0,做了什么优化

12. cookie、localStorage、sessionStorage、indexDB

13. xss、csrf

14. 算法


// 从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。

//2 ~ 10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大、小王可以看成任意数字。

/**
 *
 * @param {Array} numbers
 */
function isContinuous(numbers) {
}

/**
 * 测试代码
 */
console.log(isContinuous([3, 8, 0, 0, 1])); // false
console.log(isContinuous([8, 10, 0, 6, 0])); // true
zhaofeihao commented 4 years ago

3. 浏览器事件机制

重点是考察对冒泡捕获的理解。 解答解构:是什么 --> 怎么用 --> 特殊case --> 应用场景。

事件冒泡

事件会从最内层的元素开始发生,一直向上传播,直到document对象。

事件捕获

事件会从最外层开始发生,直到最具体的元素。

addEventListener

w3c 制定了统一的标准——先捕获再冒泡。 addEventListener的第三个参数就是为冒泡和捕获准备的.

element.addEventListener(event, function, useCapture)

当事件捕获和事件冒泡一起存在的情况,事件又是如何触发

事件冒泡与事件捕获应用:事件代理

使用事件代理的好处不仅在于将多个事件处理函数减为一个,而且对于不同的元素可以有不同的处理方法。 假如上述列表元素当中添加了其他的元素(如:a、span等),我们不必再一次循环给每一个元素绑定事件,直接修改事件代理的事件处理函数即可。

扩展:事件对象

触发dom上的某个事件时,会产生一个事件对象,里面包含着所有和事件有关的信息。 常用:

currentTarget   事件处理程序当前正在处理事件的那个元素(始终等于this)
 (currentTarget始终是监听事件者,而target是事件的真正发出者。)
preventDefault  取消事件默认行为,比如链接的跳转

stopPropagation 取消事件冒泡

target  事件的目标

参考

1. JS中事件冒泡与捕获 2. javascript 事件流 3. 深入理解e.target与e.currentTarget

zhaofeihao commented 4 years ago

9. 如何设计一个 dialog 组件

① 确定UI

三种类型:alert、confirm、modal 样式是否支持自定义

② 确定API

③ 具体实现

参考

React造轮系列:对话框组件 - Dialog 思路

zhaofeihao commented 4 years ago

indexDB

IndexedDB是HTML5规范里新出现的浏览器里内置的数据库。提供了类似数据库风格的数据存储和使用方式。IndexedDB里的数据是永久保存,适合于储存大量结构化数据,有些数据本应该存在服务器,但是通过indexedDB,可以减轻服务器的大量负担,实现本地读取修改使用,以对象的形式存储,每个对象都有一个key值索引。 IndexedDB里的操作都是事务性的。一种对象存储在一个object store里,object store就相当于关系数据库里的表。IndexedDB可以有很多object store,object store里可以有很多对象。

indexDB优点

indexDB 缺点

zhaofeihao commented 4 years ago

React diff 策略

tree diff

基于策略一,React 对树的算法进行了简洁明了的优化,即对树进行分层比较,两棵树只会对同一层次的节点进行比较。 即同一个父节点下的所有子节点。当发现节点已经不存在,则该节点及其子节点会被完全删除掉,不会用于进一步的比较。这样只需要对树进行一次遍历,便能完成整个 DOM 树的比较。

component diff

React 是基于组件构建应用的,对于组件间的比较所采取的策略也是简洁高效。

element diff(带key)

image 带key diff的过程看这里

参考

react diff 策略