1、箭头函数得this 是什么时候定下的?
一般来说,this是动态绑定的,谁调用就指向谁。箭头函数的内部this指向父级作用域中的this,(箭头函数中的 this 只取决包裹箭头函数的第一个普通函数的 this),声明时就已确定
1、== 类型转换,先判断类型是否相同,不同就进行往number转换后比较。(object转基本类型)
2、全局作用域下,let 和const 声明的变量不会挂载到window上!(会存在暂时性死区,不能在声明前使用变量)
const 声明常亮时必须要赋值,再次赋值报错const declaration
,(函数是分割作用域的唯一方式)
ES6 WeakMap WeakSet
利用Object.create, 更简单的实现原型继承。即babel中的工具函数 _inheritsLoose
function _inherits(subClass, superClass){
subClass.prototype = Object.create(superClass.prototype)
subClass.prototype.constructor = subClass
subClass.__proto__ = superClass
}
new 运算原理
function myNew(context){
let obj = {}
obj.__proto__ = context.prototype
let result = context.apply(obj, [].slice.call(arguments, 1))
return isObject(result) ? result : obj
// Object.prototype.toString.call(result) === '[object Object]' // '[object Boolean]'
}
upd协议tcp协议
应用层、传输层、网络层、链路层 常见传输层协议(udp、tcp、ftp、smtp、http) UDP 是一个面向无连接、无状态的、不可控的传输层协议 (IP电话、视频会议、直播)。 TCP 是一个面向连接的、可靠的、基于字节流的传输层协议(文本信息)(三次握手、四次挥手)。 TCP/IP中两个最具代表性的传输层协议 --- tcp和udp 应用层,负责向用户提供应用程序,如http\FTP\DNS
一、udp
UDP协议全程是用户数据报协议,有以下几个特点:
1、面向无连接,无需三次握手
具体来说就是:
- 在发送端,应用层将数据传递给传输层的udp协议,udp只会给数据增加一个udp头标识,然后就传递给网络层了。
- 在接收端,网络层将数据传递给传输层,udp只去除IP报文头就传递给应用层,不会做任何拼接操作
2、有单播,多播,广播的功能
udp 不止支持一对一,也支持一对多,多对多的方式。
3、udp是面向报文的
UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界
4、不可靠性
收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据,在网络条件不好的情况下可能会导致丢包。优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。
5、头部开销小,传输数据报文时是很高效的
udp 头部包含了以下几个数据:
- 两个十六位的端口号,分别为源端口(可选字段)和目标端口
- 整个数据报文的长度
- 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误 因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时就更高效。
一、TCP
TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。 两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。 tcp 三次握手、tcp断开连接四次挥手 有以下几个特点:
1、面向连接
发送数据前必须在两端建立连接
仅支持单播传输
只能支持点对点的数据传输
面向字节流
以字节流方式进行传输
可靠传输
TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
TCP如何保证可靠性?
除了三次握手、四次挥手外,还有
- 差错控制
- 校验和(在TCP首部会包含校验和)、确认应答(ACK应答)、重传(超时重传、快重传) 三种方法
- 流量控制 (为了避免发送方一味的发送数据,导致网络拥塞;或者超出接收方最大接收能力,数据丢弃,导致重传)
- 窗口控制实现
- 拥塞控制 (为了避免和消除网络拥塞)
- 快恢复
- 快重传 (一直重传,会造成网络更加拥堵)
- 拥塞避免
- 慢启动
超时重传的特定时间间隔如何决定的?
如果超时时间定的太长,会影响重发效率和传输的性能;如果定的太短,可能 ACK 正在返回的路上,你的数据就先重发出去了。
eg: TCP 做的,就是计算每次 发送数据 直到收到 确认应答 的这段时间,即 RTT(round Trip Time)
,再和一个 偏差值
相加,从而计算出 超时重传时间。
提供拥塞控制
当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞
TCP提供全双工通信
TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。
vue 和react 的对比
-
响应上 vue 组件在初始化时会通过Object.defineProperty对每一个data属性建立对应的watch, 然后在模板编译时收集依赖。以后只要修改data的任何一个属性,就会触发视图重新渲染. react 的机制是每次setState的时候,调用shouldComponentUpdate,判断state或props改变需不需要重新render,如果返回true才会渲染
-
模板上 react 采用jsx ,整体思路是
all in js
vue 是把html、css、js 组合到一起。 react渲染是使用jsx,用js来操作html,列表渲染、条件判断等都通过js来控制,而vue提供了模板的语法,支持指令、过滤器等模板功能,简化渲染逻辑 -
写法上 react 是类式写法。vue是声明式写法,通过传入各种options。因此react更易与typescript结合。
前端工程化
前端工程化可以分成四个方面来说,分别为模块化、组件化、规范化和自动化。 模块化是对文件、对代码和资源拆分,而组件化则是对 UI 层面的拆分 前端自动化还包含了持续集成、自动化测试
数组全排列
const permute = (nums) => {
const res = [];
const used = {};
function dfs(path) {
if (path.length == nums.length) {
res.push(path.slice()); // 拷贝一份path,加入解集res
return; // 结束当前递归分支
}
for (const num of nums) { // for枚举出每个可选的选项
// if (path.includes(num)) continue; // 查找的时间是O(n),别这么写!增加时间复杂度
if (used[num]) continue; // 使用过的,跳过
path.push(num); // 选择当前的数,加入path
used[num] = true; // 记录一下 使用了
dfs(path); // 基于选了当前的数,递归
path.pop(); // 上一句的递归结束,回溯,将最后选的数pop出来
used[num] = false; // 撤销这个记录
}
}
dfs([]); // 递归的入口,空path传进去
return res;
};
js动画为什么比css的transform要慢?
最大的区别就是transform 不会对dom 进行重排重绘 chrome中,渲染线程分为main thread和compositor thread。CSS动画如只改变transforms和opacity,这时CSS动画在compositor thread(辅线程中)就可完成。而JS动画则会在main thread执行,然后再触发compositor(辅线程)操作,所以CSS动画可以更保持流畅。
js 操作是会触发重绘重排的。 CSS动画比JS流畅的前提:
- 在Chromium基础上的浏览器中
- JS在执行一些昂贵的任务
- 同时CSS动画不触发layout或paint在CSS动画或JS动画触发了paint或layout时,需要main thread进行Layer树的重计算,这时CSS动画或JS动画都会阻塞后续操作。
导出&导入
// counter.js
let counter = 1
export default counter
main.js
import myCounter from './utilsFile'
myCounter += 1
console.log(myCounter)
会报错,es模块导入的是只读的,只能导出它们的模块才能修改 eg:
let counter = 1
export function incrementCounter(){
counter++
}
import incrementCounter from './utilsFile'
incrementCounter()
console.log(counter)
宏任务、微任务
// 1、这里主要resolve之后后面代码依然执行 !
// 2、多个then值,也是微任务
let p = new Promise((resolve, reject) => {
resolve(1);
console.log(2);
});
setTimeout(() => console.log(3));
p.then(res => {
console.log(res);
return 4;
}).then(res => {
console.log(res);
})
console.log(5);
this 值问题
let opt = {
name: "hello",
name2: this.name,
say1:function(){
console.log(this)
console.log('======say1=====')
return this.name;
},
say2: function(){
setTimeout(function(){
console.log(this)
console.log('=====say2======')
console.log(this.name);
})
},
say3: function(){
setTimeout(()=>{
console.log(this)
console.log(this.name)
})
}
}
window 下有个name 属性
console.log(opt.name2); //1. 这里打印什么? this window
console.log(opt.say1); //2. 这里打印什么? this opt
opt.say2(); //3. 这里打印什么? this window
opt.say3(); //4. 这里打印什么? this opt
数组扁平化 -- 编程
大数相加 -- 编程
长列表优化 ?
vue 中的nextTick 原理 ?
源码在src/core/util/next-tick.js
中。
vue的next-tick
实现中,使用了几种情况来延迟调用。
Promise.then > MutationObserver > setImmediate > setTimeout 来做延迟
setImmediate & setTimeout 是两种宏任务,是降级处理方案。
nextTick 兼容处理
比较版本号 -- 编程
// 转成数组,然后比较版本号
function compareInt(arr1, arr2){
let len = Math.max(arr1.length, arr2.length)
while(arr1.length < len) arr1.push(0)
while(arr2.length < len) arr2.push(0)
for(let i = 0; i< len; i++){
if(arr1[i] > arr2[i]) {
return 1
} else if(arr1[i] < arr2[i]){
return -1
}
}
return 0
}
var compareVersion = function(version1, version2){
let v1 = version1.split('.')
let v2 = version2.split('.')
v1 = v1.map((item)=> Number(item))
v2 = v2.map((item)=> Number(item))
return compareInt(v1, v2)
}
async await 原理 www.jianshu.com/p/0f1b6ae18…
面向toB,面向toC 想法上的一个区别
toC, 关注大数据、和上报的监控数据,少关注个别用户。从用户角度思考问题,面向的更多的是来着产品的述求。 toB, 来自大客户需求,人家花钱了,更加关注单个个需求,更多来之销需求方的一个述求和要求。
发散问题
深圳基本认知,0、人口1500w人, 1、面积约2000平方公里。2、汽车保有量数量300w 每天出行率为50%, 假设每座加油站提供3000辆车的服务。
- 井盖为啥是圆的?
- 受力 井洞也是圆的、井道也是圆的,圆井容易接收任意方向的横向管道。
- 运输
- 制造工艺
- 深圳有多少个加油站?
- 寻找解决问题的维度并从一个方向解决。 通常三个维度: 1、加油站服务面积推算. 2、城市车辆保有量推算 3、车辆油耗
- 收集相关的数据, 比如从政府官方统计数据获取,交通运输局,城市规划局
- 面积维度,加油站服务半径
- 官方数据统计核算预估的结果
- 怎么看待加班
- 根据项目进度动态调整,拒绝无畏的996
- 赶进度加班啥的很正常
- 怎么看待云产品
- 5g 的推广
寻找解决问题的维度-》拆解问题-》找出相关的数据变量-》从官方获取数据-》根据不同的维度明确推算公式-》对推算出来的结果偏差进行评估。
有什么要问我的
- 业务目前的一个情况
- 团队规划的方向
- 一些可以给到的个人的建议
欢迎大家快来投递哟,关于校招更多信息,可以关注 微信公众号:货拉拉招聘
内推码 NTAFmsQ
内推私聊哦