常见的前端手撕代码50道题

144 阅读2分钟

比较版本号

var compareVersion = function(version1, version2) {
    const v1 = version1.split('.');
    const v2 = version2.split('.');
    for (let i = 0; i < v1.length || i < v2.length; ++i) {
        let x = 0, y = 0;
        if (i < v1.length) {
            x = parseInt(v1[i]);
        }
        if (i < v2.length) {
            y = parseInt(v2[i]);
        }
        if (x > y) {
            return 1;
        }
        if (x < y) {
            return -1;
        }
    }
    return 0;
};

比较两个对象是否相等

实现getValueByPath

手写promise

手写eventEmitter

连续区间

  • 将一天24小时按每半小划分成48段,我们用一个位图表示选中的时间区间,例如110000000000000000000000000000000000000000000000, * 表示第一个半小时和第二个半小时被选中了,其余时间段都没有被选中,也就是对应00:00~01:00这个时间区间。一个位图中可能有多个不连续的 * 时间区间被选中,例如110010000000000000000000000000000000000000000000,表示00:00-1:00和02:00-02:30这两个时间区间被选中了。

实现一个批量请求函数, 能够限制并发量

写出一个函数trans,将数字转换成汉语的输出,输入为不超过10000亿的数字。

数组转树结构

const arr = [{ id: 2, name: '部门B', parentId: 0 }, { id: 3, name: '部门C', parentId: 1 }, { id: 1, name: '部门A', parentId: 2 }, { id: 4, name: '部门D', parentId: 1 }, { id: 5, name: '部门E', parentId: 2 }, { id: 6, name: '部门F', parentId: 3 }, { id: 7, name: '部门G', parentId: 2 }, { id: 8, name: '部门H', parentId: 4 } ]

去除字符串中出现次数最少的字符,不改变原字符串的顺序。

“ababac” —— “ababa” “aaabbbcceeff” —— “aaabbb”

 不定长二维数组的全排列

两个字符串对比, 得出结论都做了什么操作, 比如插入或者删除

sleep函数

ES5和ES6的继承? 这两种方式除了写法, 还有其他区别吗?

使用Promise实现一个异步流量控制的函数, 比如一共10个请求, 每个请求的快慢不同, 最多同时3个请求发出, 快的一个请求返回后, 就从剩下的7个请求里再找一个放进请求池里, 如此循环。