1.前端前沿技术
Rust、Web Assembly 或者是 Kotlin
2.js基本数据类型
3.map set区别
Set:
- 成员唯一、无序且不重复。
- [value, value],键值与键名是一致的(或者说只有键值,没有键名)。
- 可以遍历,方法有:add、delete、has。
WeakSet:
- 成员都是对象。
- 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏。
- 不能遍历,方法有add、delete、has。
Map:
- 本质上是键值对的集合,类似集合。
- 可以遍历,方法很多可以跟各种数据格式转换。
WeakMap:
- 只接受对象作为键名(null除外),不接受其他类型的值作为键名。
- 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的。
- 不能遍历,方法有get、set、has、delete。
4.es6 generate函数
5.generate ,promise,async await区别
6.闭包应用场景,以及函数柯里化是怎么实现
1)通过循环给页面上多个dom节点绑定事件。==>可以用let代替
2)防抖节流
防抖:
高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间在触发,则重新计算时间(后面触发的事件执行,替代了前面的事件)
节流:
高频率触发的事件,在指定的单位时间内,只响应第一次(前面触发的执行前,忽略后面的事件)
3)函数柯里化
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
柯里化:把接收多个参数的函数变换成接收一个单一参数的函数(单一参数为多个参数中的第一个)
函数柯里化思想:一个JS预处理的思想,降低通用性,提高适用性。
function curryingAdd(x) {
return function (y) {
return x + y
}
}
curryingAdd(1)(2)//3
特点:
参数复用 需要输入多个参数,最终只需输入一个,其余通过arguments来获取 提前返回 避免重复去判断某一条件是否符合,不符合则return 不再继续执行下面的操作 延迟执行 避免重复的去执行程序,等真正需要结果的时候再执行
7.事件循环
JS是单线程的,也就是说它只有一个主线程,主线程执行完执行栈的任务后去检查异步的任务队列,如果异步事件触发,就将其加到主线程的执行栈。
事件循环流程
- 执行宏任务队列中第一个任务,执行完后移除它
- 执行所有的微任务,执行完后移除它们
- 执行下一轮宏任务(重复步骤2)
宏任务 > 所有微任务 > 宏任务 如此循环就形成了event loop,其中,每轮执行 一个宏任务 和所有的微任务
主线程从"任务队列"中读取事件,不断循环的过程,就形成了Event Loop(事件循环)
8.定时器延时零秒,实际上延时多少秒
HTML5标准规定
setTimeout的最短时间间隔是4毫秒;
setInterval的最短间隔时间是10毫秒, 也就是说,小于10毫秒的时间间隔会被调整到10毫秒
这和浏览器及操作系统有关
9.深拷贝需要考虑哪些情况,正则和date如何处理的
深浅拷贝区别和实现方法
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝会另外创造一个一模一样的对象,新对象跟元对象不共享内存,修改新对象不会改变原对象。
如何实现深拷贝?
JSON.parse(JSON.stringify(obj))
deepclone
if(typeof arr[item]==="object"){obj[item]=deepClone(arr[item]); }
else{obj[item]=arr[item];
通过JSON.parse( ) 和JSON.stringify( ) JSON.parse(JSON.stringify(obj))
以递归方式使用for in 方法来实现深拷贝
第三方库lodash的_.cloneDeep方法
如何实现浅拷贝
通过Object.assign( ) 简单实现
.通过 for in方法
通过 扩展运算符 ... 方法
10.快速排序、冒泡排序
1.冒泡排序
冒泡排序的原理是对临近的两个数字进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或者最小的数字就被交换到了最后一位了。然后再从头开始进行这种比较和交换,一直到完成排序。 2.快速排序
找基准点、把比基准点小的数放到它的左边,大的放在右边、递归下去即可
11.tcp三次握手
1)客户端向服务端发送连接请求报文段,
2)服务端收到连接请求报文段后,同意连接发送应答,
3)客户端收到连接同意的应答,向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
建立tcp过程,三次握手
过程:
一、域名解析 一般我们访问的url都是域名,例如:www.baidu.com,需要将其解析为服务器IP才能进行访问。搜索浏览器自身的DNS缓存;搜索操作系统自身的DNS缓存;读取hosts文件;如果以上都没有查找到要访问的url,就向DNS服务器发起一个DNS解析请求; 二、建立连接:TCP三次握手建立连接。
三、发起HTTP请求 四、服务器响应请求返回结果 五、浏览器得到HTML标签 六、浏览器解析HTML中的js/css等资源 七、浏览器对页面进行渲染 八、断开连接 四次挥手断开连接。
why3次握手?
客户端向服务器发送请求报文(sequence),告诉服务器,想要建立连接;** 服务器听到连接请求报文后,如果同意建立连接,则向客户端发送确认(发送确认acknowledge和sequence); 客户端接收到之后,发送确认(向服务器发送确认acknowledge); 此时,客户端与服务器确认可以互相传送消息。**
三次是保证双方互相明确对方能收能发的最低值。当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示服务端发来的连接同意应答已经成功收到。
为什么连接建立需要三次握手,而不是两次握手? 防止失效的连接请求报文段被服务端接收,从而产生错误。
why4次挥手 ?
TCP连接是全双工通信的,而断开时双方都需要确定两个问题:自己是否还有数据要发送,对端是否还有数据要发送,而四次挥手正好在双方同步了这两个问题。
第一次挥手:client告诉server自己的数据已全部发送,client可以回收发送缓冲区,server可以回收接收缓冲区 第二次挥手:server告诉client自己收到了关闭信息 第三次挥手:server告诉client自己的数据已全部发送,server可以回收发送缓冲区,client可以回收接收缓冲区 第四次挥手:client告诉server自己收到了关闭信息 可以发现,四次挥手同样一次都不能少,如果少了其中任何一次,总有一方不能可靠的通知对方自己的数据已发送完毕,因此,连接不可能可靠的断开,TCP也就成了不可靠的协议。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
请求行分为三个部分:请求方法、请求地址和协议版本
HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。
状态行由3部分组成,分别为:协议版本,状态码,状态码描述。
12.vue数据双向绑定原理
Vue数据双向绑定原理是通过数据劫持结合“发布者-订阅者”模式的方式来实现的,首先是对数据进行监听,然后当监听的属性发生变化时则告诉订阅者是否要更新,若更新就会执行对应的更新函数从而更新视图。
13.1像素问题
为什么不同设备下一个像素表现的不同?
中后台 单页面 vue-cli vue-router 局部更新
前台 多页面 SEO 提供网站曝光率,访问量 服务端渲染
nust .js
Bejson