【面试】高频面试题

410 阅读4分钟

目录

  1. 函数默认参数arguments
  2. 异步函数按照顺序执行
  3. 实现一个react组件,可以通过modal.show()方式调用
  4. 数组元素的下标查找时间复杂度
  5. new WebSocket 发生了什么?
  6. ws的心跳检查是如何实现的
  7. ws的建立是通过一个http请求来建立的,与建立流程
  8. ws介绍
  9. 二叉树右侧光照到的节点获取

待办:

  1. 二叉树(节点都是一进一出),判断循环引用的问题获取制定节点的方法

一、函数默认参数与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的建立流程

-这个表明将http协议转成websocket协议

之前在业务当中,是业务需要在ws建立前,发一个http请求的连接。

建立ws无需请提前发http请求

八、ws介绍

九、二叉树右侧光照到的节点获取

image.png

获取图中的被右侧光照到的节点

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 lexeme
  • 5 * 10^1 + 6 * 10^0 // 15 此为10进制的56的表示 5的10的1次方+6的10的0次方

总结