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

1.乱码只有两种特殊字符分别是?和�;
2.如果乱码的末尾是?则它的下一位字母肯定是大写;

  1. let str = "I?���love�??�the�?great�?�?wall�in��?beijing"
  2. str = str.replace(/�/g,'')//去掉乱码符号
  3. let strArr = str.split("?")//截取成数组
  4. strArr = strArr.map(item => {//循环数组并把首字母改成大写并拼接
  5. return item.charAt(0).toUpperCase() + item.slice(1)
  6. })
  7. strArr = strArr.join(" ")//数组转字符串
  8. console.log(strArr)

二、不可用 JavaScript 控制循环的方法和关键字,最终生成数组 [3, 6, …]。

  • 范围和初始值都使用参数控制;
  • 每次加 3。 ```javascript function fn(num, max, arr){ if (typeof num !== “number”) return false; if (typeof max !== “number”) return false; arr.push(num); if(num >= max) return arr; //判断num大于最大值或者等于最大值得时候结束递归 return fn(num+3, max, arr); }

fn(3, 30, []); console.log(fn(3, 30, []));

  1. <a name="ZGQLR"></a>
  2. #### 三、设计一个自由可灵活配置的时间调度器,有a,b,c,d...很多个需要被调度的方法(方法名称的命名可随意),调度有两种形式,一个是顺序调用(例如调度完a后才能调度b),一个是间隔某个时间进行循环调度。用一个统一的方法进行封装可以实现下列的例子:
  3. 1.可以为5秒后调用a,3秒后调用b,7秒后调用c。d...z方法不执行(不执行的方法可以设计成不传递参数),那么在第14秒的时候开始重新从0秒循环,又变成5秒后调用a,3秒后调用b,7秒后调用c,这样循环往复; 2.每间隔6秒调用一次a,每间隔4秒调用一次b,c...z方法不执行; 第一秒先执行a,3秒后执行b,但是c却是每间隔3秒执行一次,d是每间隔4秒执行一次,a和b是每4秒进行一次循环; 3.a不执行,b和c每间隔3秒执行一次,d不执行;
  4. ```javascript
  5. class TimeScheduler {
  6. constructor() {
  7. this.events = [];
  8. this.orderCallStack = [];
  9. this.ownCallStack = [];
  10. }
  11. //添加执行栈函数,orderExec用于区别是顺序调用还是独立调用,注意同一个函数存在顺序调用和独立调用时需要add两次
  12. add(fn = () => {}, orderExec = false, timeout = 3) {
  13. let fnc;
  14. if (orderExec) {
  15. fnc = () => {
  16. setTimeout(() => {
  17. fn();
  18. this.next();
  19. }, timeout * 1000)
  20. };
  21. } else {
  22. fnc = () => {
  23. setInterval(() => {
  24. fn()
  25. }, timeout * 1000)
  26. };
  27. }
  28. this.events.push({
  29. fnc,
  30. orderExec
  31. })
  32. }
  33. remove(fnc = () => {}) {
  34. this.events = this.events.filter(item => item.fnc === fnc);
  35. }
  36. clear() { //清除存储数据及清空调用栈
  37. this.events = [];
  38. this.orderCallStack.forEach(item => {
  39. clearTimeout(item.fnc);
  40. });
  41. this.ownCallStack.forEach(item => {
  42. clearInterval(item.fnc);
  43. });
  44. this.ownCallStack = [];
  45. this.orderCallStack = [];
  46. }
  47. start() { //开始执行
  48. this.orderCallStack = this.events.filter(item => !!item.orderExec);
  49. this.ownCallStack = this.events.filter(item => !item.orderExec);
  50. this.ownCallStack.forEach(item => item.fnc());
  51. this.next();
  52. }
  53. stop() { //停止执行
  54. this.orderCallStack.forEach(item => {
  55. clearTimeout(item.fnc);
  56. });
  57. this.ownCallStack.forEach(item => {
  58. clearInterval(item.fnc);
  59. });
  60. this.ownCallStack = [];
  61. this.orderCallStack = [];
  62. }
  63. next() { //顺序调用栈执行函数
  64. let obj = this.orderCallStack.shift() || {};
  65. if (obj.fnc) {
  66. this.orderCallStack.push(obj);
  67. obj.fnc();
  68. }
  69. }
  70. }
  71. let a = () => {
  72. console.log("a");
  73. }
  74. let b = () => {
  75. console.log("b");
  76. }
  77. let c = () => {
  78. console.log("c");
  79. }
  80. const timeScheduler1 = new TimeScheduler();
  81. timeScheduler1.add(a, true, 5);
  82. timeScheduler1.add(b, true, 3);
  83. timeScheduler1.add(c, true, 7);
  84. timeScheduler1.start();