目录
函数默认参数与arguments异步函数按照顺序执行- 实现一个react组件,可以通过
modal.show()方式调用 数组元素的下标查找与时间复杂度new WebSocket发生了什么?- ws的
心跳检查是如何实现的 - ws的建立是通过一个
http请求来建立的,与建立流程 ws介绍二叉树被右侧光照到的节点获取
待办:
- 二叉树(节点都是一进一出),
判断循环引用的问题与获取制定节点的方法
一、函数默认参数与arguments
函数默认参数与arguments,会影响代码的执行结果。
1) demo1 有默认参数
babel编译通过ES6与ES5编译的结果不一样,会导致代码输出不一样。有默认参数时,按照ES6的方式去编译,没有时按照ES5的方式去编译。
arguments在ES6中不能被改变?
function side(arr) {
console.log(arr[0]);
arr[0] = arr[2];
}
function a(a, b, c = 3) {
c = 10;
side(arguments);
return a + b + c;
}
console.log(a(1, 2, 3));
1) demo2 无默认参数
function side(arr) {
arr[0] = arr[2];
}
function a(a, b, c) {
c = 10;
side(arguments);
return a + b + c;
}
console.log(a(1, 2, 3));
二、异步函数按照顺序执行
输入一个异步函数组成的数组,要求按照顺序执行这些异步函数
以下demo只是实现思路,不可使用
function pipePromise(arr) {
if (!Array.isArray(arr)) {
return;
}
for (let i = 0; i <= arr.length; i++) {
// arr[i]()
// fn异步函数放入任务队列,并执行完成后,再执行Fn1
// 如何判断异步函数执行完成
let promiseI = new Promise((res, rej) => {
res(arr[i]());
});
if (promiseI.status === 'fullied' || promiseI.status === 'rejected') {
}
}
}
function pipePromise(arr) {
if (!Array.isArray(arr)) {
return;
}
let arr1 = arr.reduce((pre, cur) => {
// if(cur()) {
// pre.push(cur)
// }
pre.then(cur);
}, Promise.resolve);
}
三、实现一个react组件,可以通过modal.show()方式调用
function Modal() {
const [] = useState();
this.show = () => {
document.appendChild(domFN);
};
render(<>domFN</>, 'id1');
}
// call
let modal = new Modal();
modal.show();
四、数组元素的下标查找与时间复杂度
输入数组是被随机抽取一个item,进行分段,交换位置后的数组
比如[1,2,3,4,5],随机抽取位置是2,分段后的数据为[3,4,5,1,2]
要实现的方法是从[3,4,5,1,2]中查找任意一个元素的下标,并给出最优的时间复杂度的解决方案。
比如,用循环的话,时间复杂度是O(n)
不用循环有其他哪些方式去实现
五,new WebSocket 发生了什么?
六、ws的心跳检查是如何实现的
七、ws的建立流程
之前在业务当中,是业务需要在ws建立前,发一个http请求的连接。
建立ws无需请提前发http请求
八、ws介绍
九、二叉树被右侧光照到的节点获取
获取图中的被右侧光照到的节点
1) 以下代码只是一个思路,不可使用
以下思路不好,后续会补充好的思路 分为左,右,判断左右分支的层级。如左侧深,那么把左测靠右的节点取出来。 然后,在把右分支右侧节点全取出来。
// type Node = { left?: Node; right?: Node; value: any };
let treeObj = {
'a':{
'a1':{
'a11': {
aValue: 'aValue'
}
},
'a2':{
'a21': 'a21 value',
'a22': 'a22 value'
}
}
};
const isObjFn = (o) => {
return Object.prototype.toString.call(o) === '[object Object]'
};
const deepFn = (treeObj) => {
if(!isObjFn(treeObj)){return;}
let leftIndex=0; //左树层级
let rightIndex=0; //右树层级
let right = [];// 存储右侧节点
let left = []; // 存储左侧节点
let lightNode = []; // 存储平行光照节点
for(let i in treeObj){
if( isObjFn(treeObj[i]) ){
deepFn(treeObj[i])
}else{
// 存储节点
if(i==='a1') { // 左侧根节点
}else if(i==='a2'){ // 右侧根节点
}else{
void null
}
}
}
};
十、 repeat字符串
1) demo
1.1) while的方式
let str = 'abc';
function repeat(str='', num=0){
if(typeof str != 'string'){return};
// 优化去改变while的执行次数
// 比如 针对的是偶数,num = num/2,最后得到的str改变成str+str
// 改变为这样的 O(loga) + O(logb) + O(logc) 时间复杂度
let resStr = '';
while(num--){
resStr += str;
}
return resStr;
}
repeat(str,3)
// "abcabcabc"
1.2) 递归 的方式
脚本有问题不可使用, 改变为这样的 O(loga) + O(logb) + O(logc) 时间复杂度
let str = 'abc';
function repeat(str='', num=0){
if(typeof str != 'string'){return};
// 改变为这样的 O(loga) + O(logb) + O(logc) 时间复杂度
let resStr = '';
if(num%2===0){// 偶数
resStr += str;
repeat(str, num11 | num/2) // 递归的次数 为num11 看如何计算
}
return resStr + resStr;
}
repeat(str,3); // 有问题,后续处理
2) 规律查找
// O(loga) + O(logb) + O(logc)
// 1 // 1 * 2^0
// 2 // 0 * 2^0 + 1 * 2^1
// 3 // 1 * 2^0 + 1 * 2^1
// 4 // 0 * 2^0 + 0 * 2^1 + 1 * 2^2
// 5 // 1 * 2^0 + 0 * 2^1 + 1 * 2^2
// 6 // 0 * 2^0 + 1 * 2^1 + 1 * 2^2
// 规律查找 二进制规律
// 1 // 1
// 2 // 0 1
// 3 // 1 1
// 4 // 0 0 1
// 5 // 1 0 1
// 6 // 0 1 1
二进制规律,比如
6 的二进制是110那么,6就表示为第一位的1表示是2次方第二位的1表示1次方,第三位的0表示0次方如下
0 * 2^0 + 1 * 2^1 + 1 * 2^2
其他
AST语法树,解析时token lexeme5 * 10^1 + 6 * 10^0// 15 此为10进制的56的表示 5的10的1次方+6的10的0次方