一、用正则表达式来将字符串I?���love�??�the�?great�?�?wall�in��?beijing更改为:I love the Great Wall in Beijing,主要是为了解决编码的问题导致的问题,规律:

  1. 乱码只有两种特殊字符分别是?;
  2. 如果乱码的末尾是?则它的下一位字母肯定是大写;
 class stringReg {            constructor(text) {                this.text = text;                this.init();            }            getString() {//将符合规律2的单词首字母大写                const regArr = this.text.match(/[\?][a-z]/g);                for (let i = 0; i < regArr.length; i++) {                    this.text = this.text.replace(regArr[i], regArr[i][1].toUpperCase());                }            }            trim() {//将多个空格转化为单个空格                this.text = this.text.replace(/\s\s*/g, ' ');            }            delSymbol() {//将特殊符号全部转化为空格                this.text = this.text.replace(/[\?\�]/g, ' ');            }            init() {                this.getString();                this.delSymbol();                this.trim();            }        }        const { text } = new stringReg("I?���love�??�the�?great�?�?wall�in��?beijing");        console.log(text); //I love the Great Wall in Beijing

二、不使用类似for,while循环控制语句和js本身自带方法(如:forEach)的情况下,实现将一个空数组[]赋值成[0,2,4,6,8,*****************]范围0-100便可。

//递归思想function evenNum(min = 0, max = 100, arr = []) {    if (min % 2 === 0) {        arr.push(min);    }    if (min === max) {        return arr;    }    return evenNum(++min, max, arr);}console.log(evenNum(0, 6)); //[0, 2, 4, 6]

三、设计一个自由可灵活配置的时间调度器,有a,b,c,d...很多个需要被调度的方法(方法名称的命名可随意),调度有两种形式,一个是顺序调用(例如调度完a后才能调度b),一个是间隔某个时间进行循环调度。用一个统一的方法进行封装可以实现下列的例子:

  1. 可以为5秒后调用a,3秒后调用b,7秒后调用c。d...z方法不执行(不执行的方法可以设计成不传递参数),那么在第14秒的时候开始重新从0秒循环,又变成5秒后调用a,3秒后调用b,7秒后调用c,这样循环往复;
  2. 每间隔6秒调用一次a,每间隔4秒调用一次b,c...z方法不执行;
  3. 第一秒先执行a,3秒后执行b,但是c却是每间隔3秒执行一次,d是每间隔4秒执行一次,a和b是每4秒进行一次循环;
  4. a不执行,b和c每间隔3秒执行一次,d不执行;
class TimeScheduler {    constructor() {        this.events = [];        this.orderCallStack = [];        this.ownCallStack = [];    }    //添加执行栈函数,orderExec用于区别是顺序调用还是独立调用,注意同一个函数存在顺序调用和独立调用时需要add两次    add(fn = () => {}, orderExec = false, timeout = 3) {        let fnc;        if (orderExec) {            fnc = () => {                setTimeout(() => {                    fn();                    this.next();                }, timeout * 1000)            };        } else {            fnc = () => {                setInterval(() => {                    fn()                }, timeout * 1000)            };        }        this.events.push({            fnc,            orderExec        })    }    remove(fnc = () => {}) {        this.events = this.events.filter(item => item.fnc === fnc);    }    clear() { //清除存储数据及清空调用栈        this.events = [];        this.orderCallStack.forEach(item => {            clearTimeout(item.fnc);        });        this.ownCallStack.forEach(item => {            clearInterval(item.fnc);        });        this.ownCallStack = [];        this.orderCallStack = [];    }    start() { //开始执行        this.orderCallStack = this.events.filter(item => !!item.orderExec);        this.ownCallStack = this.events.filter(item => !item.orderExec);        this.ownCallStack.forEach(item => item.fnc());        this.next();    }    stop() { //停止执行        this.orderCallStack.forEach(item => {            clearTimeout(item.fnc);        });        this.ownCallStack.forEach(item => {            clearInterval(item.fnc);        });        this.ownCallStack = [];        this.orderCallStack = [];    }    next() { //顺序调用栈执行函数        let obj = this.orderCallStack.shift() || {};        if (obj.fnc) {            this.orderCallStack.push(obj);            obj.fnc();        }    }}

例1使用示例:

let a = () => {    console.log("a");}let b = () => {    console.log("b");}let c = () => {    console.log("c");}const timeScheduler1 = new TimeScheduler();timeScheduler1.add(a, true, 5);timeScheduler1.add(b, true, 3);timeScheduler1.add(c, true, 7);timeScheduler1.start();console.log(timeScheduler1);