第 1 题:(滴滴、饿了么)写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?

1. 更准确

因为带key就不是就地复用了,在sameNode函数 a.key === b.key对比中可以避免就地复用的情况。所以会更加准确。

2. 更快

利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。主要是为了提升diff【同级比较】的效率。自己想一下自己要实现前后列表的diff,如果对列表的每一项增加一个key,即唯一索引,那就可以很清楚的知道两个列表谁少了谁没变。而如果不加key的话,就只能一个个对比了。

vue和react都是采用diff算法来对比新旧虚拟节点,从而更新节点。在vue的diff函数中(建议先了解一下diff算法过程)。 在交叉对比中,当新节点跟旧节点头尾交叉对比没有结果时,会根据新节点的key去对比旧节点数组中的key,从而找到相应旧节点(这里对应的是一个key => index 的map映射)。如果没找到就认为是一个新增节点。而如果没有key,那么就会采用遍历查找的方式去找到对应的旧节点。一种一个map映射,另一种是遍历查找。相比而言。map映射的速度更快。 vue部分源码如下:

第 2 题:['1', '2', '3'].map(parseInt) what & why ?

首先让我们回顾一下,map函数的第一个参数callback:

var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])

这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。

而parseInt则是用来解析字符串的,使字符串成为指定基数的整数。

parseInt(string, radix)

接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。

了解这两个函数后,我们可以模拟一下运行情况

parseInt('1', 0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。这个时候返回1

parseInt('2', 1) //基数为1(1进制)表示的数中,最大值小于2,所以无法解析,返回NaN

parseInt('3', 2) //基数为2(2进制)表示的数中,最大值小于3,所以无法解析,返回NaN

map函数返回的是一个数组,所以最后结果为[1, NaN, NaN]

第 3 题:(挖财)什么是防抖和节流?有什么区别?如何实现?

防抖

触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间

思路

每次触发事件时都取消之前的延时调用方法

节流

高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

思路

每次触发事件时都判断当前是否有等待执行的延时函数

第 4 题:介绍下 Set、Map、WeakSet 和 WeakMap 的区别?

Set

成员唯一、无序且不重复

[value, value],键值与键名是一致的(或者说只有键值,没有键名)

可以遍历,方法有:add、delete、has

WeakSet

成员都是对象

成员都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏

不能遍历,方法有add、delete、has

Map

本质上是键值对的集合,类似集合

可以遍历,方法很多可以跟各种数据格式转换

WeakMap

只接受对象作为键名(null除外),不接受其他类型的值作为键名

键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的

不能遍历,方法有get、set、has、delete

第 5 题:介绍下深度优先遍历和广度优先遍历,如何实现?

第 6 题:请分别用深度优先思想和广度优先思想实现一个拷贝函数?

第 7 题:ES5/ES6 的继承除了写法以外还有什么区别?

先看ES5的继承(原型链继承)

ES6继承

对比代码可以知道,子类的继承都是成功的,但是问题出在,子类的 __proto__ 指向不一样。

ES5 的子类和父类一样,都是先创建好,再实现继承的,所以它们的指向都是 [Function] 。

ES6 则得到不一样的结果,它指向父类,那么我们应该能推算出来,它的子类是通过 super 来改造的。

根据 es6--阮一峰 在class继承里面的说法,是这样子的:

引用阮一峰的 ECMAScript6入门 的class继承篇

子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象。

ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this。

1、class 声明会提升,但不会初始化赋值。Foo 进入暂时性死区,类似于 let、const 声明变量。

2、class 声明内部会启用严格模式。

3、class 的所有方法(包括静态方法和实例方法)都是不可枚举的。

4、class 的所有方法(包括静态方法和实例方法)都没有原型对象 prototype,所以也没有[[construct]],不能使用 new 来调用。

5、必须使用 new 调用 class。

6、class 内部无法重写类名

第 8 题:setTimeout、Promise、Async/Await 的区别

其中settimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行; promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行;async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行。

第 9 题:(头条、微医)Async/Await 如何通过同步的方式实现异步

async await 用于把异步请求变为同步请求的方式,第一个请求的返回值作为后面一个请求的参数,其中每一个参数都是一个promise对象

例如:这种情况工作中会经常遇到

第 10 题:(头条)异步笔试题

请写出下面代码的运行结果

第 11 - 20 题

第 11 题:(携程)算法手写题

已知如下数组:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

第 12 题:(滴滴、挖财、微医、海康)JS 异步解决方案的发展历程以及优缺点。

1. 回调函数(callback)

缺点:回调地狱,不能用 try catch 捕获错误,不能 return`

回调地狱的根本问题在于

缺乏顺序性: 回调地狱导致的调试困难,和大脑的思维方式不符

嵌套函数存在耦合性,一旦有所改动,就会牵一发而动全身,即(控制反转,嵌套函数过多的多话,很难处理错误

优点:解决了同步的问题(只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。)

2. Promise

Promise就是为了解决callback的问题而产生的。

Promise 实现了链式调用,也就是说每次 then 后返回的都是一个全新 Promise,如果我们在 then 中 return ,return 的结果会被Promise.resolve() 包装

优点:解决了回调地狱的问题

缺点:无法取消 Promise ,错误需要通过回调函数来捕获

3. Generator

特点:可以控制函数的执行,可以配合 co 函数库使用

4. Async / await

async、await 是异步的终极解决方案

优点是:代码清晰,不用像 Promise 写一大堆 then 链,处理了回调地狱的问题

缺点:await 将异步代码改造成同步代码,如果多个异步操作没有依赖性而使用 await 会导致性能上的降低。

第 13 题:(微医)Promise 构造函数是同步执行还是异步执行,那么 then 方法呢?

执行结果是:1243

promise构造函数是同步执行的,then方法是异步执行的

第 14 题:(兑吧)情人节福利题,如何实现一个 new

先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了

首先创建一个空的对象,空对象的 ___proto____属性指向构造函数的原型对象

把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象

如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象

第 15 题:(网易)简单讲解一下http2的多路复用

第 16 题:谈谈你对TCP三次握手和四次挥手的理解

第 17 题:A、B 机器正常连接后,B 机器突然重启,问 A 此时处于 TCP 什么状态

如果A 与 B 建立了正常连接后,从未相互发过数据,这个时候 B 突然机器重启,问 A 此时处于 TCP 什么状态?如何消除服务器程序中的这个状态?(超纲题,了解即可)

第 18 题:(微医)React 中 setState 什么时候是同步的,什么时候是异步的?

第 19 题:React setState 笔试题,下面的代码输出什么?

第 20 题:介绍下 npm 模块安装机制,为什么输入 npm install 就可以自动安装对应的模块?

83人点赞

react 面试题 高级_高级前端面试题目大全(一)相关推荐

  1. JS 基础面试题 2019年最新前端面试题目

    1.js基础 1.eval是做什么的? 它的功能是把对应的字符串解析成JS代码并运行: 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行). 由JSON字符串转换为JSON ...

  2. 前端面试题目大全(附答案)

    一.html & js & css 1.AMD和CMD是什么?它们的区别有哪些? AMD和CMD是二种模块定义规范.现在都使用模块化编程,AMD,异步模块定义:CMD,通用模块定义.A ...

  3. 2018年中高级前端面试题目小结

    2018年中高级前端面试题目小结 前言 关于前端面试,及面试题目,我之前有很多文章总结过,可以在右侧搜索面试,进行查找.其实面试中可以问的问题很多,最近几年,我也面试过很多工作2-4年的前端,我一般会 ...

  4. JAVA工程师面试题目大全_绝对值得看

    JAVA工程师面试题目大全 一.单选题 1.下列哪种说法是正确的( D) A)实例方法可直接调用超类的实例方法 B)实例方法可直接调用超类的类方法 C)实例方法可直接调用其他类的实例方法 D)实例方法 ...

  5. 前端面试知识点大全——浏览器篇

    总纲:前端面试知识点大全 目录 1.浏览器工作原理 2.浏览器如何解析css,如何渲染css的 2.1 构建DOM树 2.2 构建CSSOM规则树(就是css规则树) 2.3 渲染阻塞 2.4 构建渲 ...

  6. 前端面试知识点大全——JS篇(三)

    总纲:前端面试知识点大全 目录 1.变量声明提升 2.冒泡机制 3.attribute 和 property 4.document load 和 document DOMContentLoaded 5 ...

  7. 面试题目_数据分析SQL面试题目9套汇总

    金九银十又是找工作的好季节啊,最近不少数据蛙数据分析社群同学,问到一些面试数据分析时的SQL题目,所以就结合大家的面试题目以及工作场景给大家总结了一些经典题目.同时也特别感谢001号同学和002号同学 ...

  8. pythonweb项目面试题_python和web框架面试题目整理(1)

    1.django的处理流程是什么? 答:(1)用户通过浏览器发送请求 (2)请求到达request中间件,中间件对request请求做预处理或者直接返回response (3)若未返回response ...

  9. java简单的面试题目_简单的面试题目,大跌眼镜的结果

    原标题:简单的面试题目,大跌眼镜的结果 大老远跑来面试,总不能聊几句就走人吧.碍于情面,起码也得聊上十几分钟.招聘高峰这种情况尤甚,浪费你我时间.所以越来越多的组织会采用电话面试的方式,进行初步筛选. ...

最新文章

  1. 对象***已断开连接或不在该服务器上 的解决方案之一
  2. 2019微软研究大盘点:机器学习突破即将到来,人机交互更加真实
  3. Android--Handler使用
  4. [置顶]       设计模式之创建类模式——原型模式
  5. raise IOError('The file is not exist!')
  6. java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会
  7. cocos2d-x游戏实例(20)-纵版射击游戏(7)
  8. heatmap个人简单理解
  9. 湖首大学计算机科学硕士申请,湖首大学王牌专业之一丨计算机科学专业
  10. linux 7 yum源,Linux Redhat 7 安装免费yum源
  11. 光储充一体化充电站_忙时给车充电 闲时上网供电 多能电动车充电站在乐清投用...
  12. 运算符重载 返回类型说明符后加_C++日志(三十八)干货!带你搞懂什么是运算符重载!...
  13. 使用AMOS图形建立和检测模型(3)
  14. 北京邮电大学计算机考研资料汇总
  15. 【云原生 • Kubernetes】k8s功能特性、k8s集群架构介绍
  16. C/C++编程必备网址
  17. c++实现currency类(两种)
  18. 绩效被打C了,谈谈「绩效考核」背后的逻辑以及潜规则
  19. 你需要但是找不到的网站,其实不太想分享,有你想要想收藏的
  20. 2021年危险化学品经营单位安全管理人员模拟试题及危险化学品经营单位安全管理人员实操考试视频

热门文章

  1. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)...
  2. ASP.NET Web API身份验证和授权
  3. OnItemCommand属性使用方法
  4. Linux 调优方案, 修改最大连接数(ulimit命令)
  5. 基于pygame实现的飞机大战游戏
  6. XShell常用快捷键
  7. codeigniter在nginx安装配置及URL重写
  8. redis类型[string 、list 、 set 、sorted set 、hash]
  9. CSS固定定位[相对浏览器] 相对定位[相对自己] 绝对定位[有relative的元素]
  10. PHP常用正则:手机 邮箱 网址