八月

222 阅读2分钟

1.实现一个防抖功能第一次不防抖,第二次开始防抖

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <button id="debounce">点我</button>
  <script>
    //@click="debounce(sayHi,2000,true)"
    function debounce(fn,delay,immediate=true) {
      let timer=null;
      let n=0;
      return function (){
        if(timer){
          clearTimeout(timer)
        };
        if(immediate){
          fn.call(this, arguments);
          console.log(`${arguments},我是立即执行的函数,里面的this是${this},执行第${++n}次`)
          immediate=false;
          return 
        }
        timer=setTimeout(()=>{
          fn.apply(this,arguments);
          console.log(`${arguments},我是被防抖的函数,里面的this是${this},执行第${++n}次`)
        },delay);
       
      }
    };
    function sayHi() { 
      console.log(`他说了hello,防抖成功!`);
    }
    window.onload=function(){
      var mydebounce=document.getElementById('debounce');
      mydebounce.addEventListener('click', debounce(sayHi, 2000))
    }
  </script>
</body>
</html>

2.正则表达式

// 写一个正则表达式,清除字符串前后空格
function trim(str) {
  return str.replace(/^\s*|\s*$/g,'')
}
// console.log(`1---${trim(' 1 2 33  ')}--2`);

// 验证邮箱
function yanzhenEmail(email){
  return /[\w.]+\@[\w]+\.(com|edu|net)/.test(email)
}
// 正向预查
var str = "abaaaaa",
  reg = /a(?=b)/g;
console.log(str.match(reg));//[ 'a' ]

// 将 24315436 转换成 24,315,436 
function kexue(num){
  let str=''+num;
  let reg = /(?=\B(\d{3})+$)/g
  return str.replace(reg,',');
}
console.log(kexue(24315436));

//3. 实现aaBbbCcc(驼峰)转换为aa-bbb-ccc
var str="aaBbbCcc"
function handleStr(str){
  var m=str.match(/(\w)\1*/gi);
  console.log(m);
  var res=m.map((item,index)=>{
    if(index==0){
      return item
    }else{
      return `-${item.toUpperCase()}`
    }
  });
  console.log(res,res.join(''));
}
handleStr(str);
// 4. 实现aa - bbb - ccc转换为aaBbbCcc( 驼峰) 
var str1 = 'aa-bbb-ccc'
function transformStr3(str) {
  var re = /-(\w)/g;
  return str.replace(re, function ($0, $1) {
    return $1.toUpperCase();
  });
};
console.log(transformStr3(str1));//aaBbbCcc
let str = "abcbcbcbbd";
let num = 0;
let char = '';

// 使其按照一定的次序排列
str = str.split('').sort().join(''); //abbbbbcccd
// 定义正则表达式
let re = /(\w)\1*/g;
console.log(str.match(re)); //[ 'a', 'bbbbb', 'ccc', 'd' ]
str=str.replace(re, ($0, $1) => {
  if (num < $0.length) {
    num = $0.length;
    char = $1;
    console.log(num,char);
  }
});
console.log(str,`字符最多的是${char},出现了${num}次`); //字符最多的是b,出现了5次

var str1='1 2 3 4 5 6 7 8'//将>5的数字替换为*
str1=str1.replace(/(\d)/g, function ($0, $1) {
  return $1 = $1>5?'*':$1
})
console.log(str1); //1 2 3 4 5 * * *

//把 "Doe, John" 转换为 "John Doe" 的形式:
var str2 = "Doe, John";
str2=str2.replace(/(\w+), (\w+)/,'$2 $1');
console.log(str2); //"John Doe"

3.牛客网输入

可能有多个输入测试用例:
输入:
2 2  //映射条令指数和 输入的条令条数
ss tt
mm nn
ss
mm
1 1
xx yy
xx
输出: //输出条令响应的动作
tt 
nn
yy
function inputHandle() {
  while (lineNum = readline()){
    var [N, M] = lineNum.split(' ');
    var map = new Map();
    while (N--) {
      var lines = readline();
      var [cmd, action] = lines.split(' ');
      map.set(cmd, action);
    }
    while (M--) {
      var cmdLine = readline();
      print(map.get(cmdLine))
    }
    map = new Map();
  }
}

4.反转数组中任意两个位置之间的数,包括两端

function reverseArr(array,start,end){
  let i,j;
  for(i=start,j=end;i<=j;i++,j--){
    [array[i], array[j]] = [array[j], array[i]]
  }
  return array
}

5.按层级扁平化

function flat(arr,n){
  while(n&&arr.some((item)=>Array.isArray(item))){
    arr=[].concat(...arr);
    n--;
  }
  return arr
}
console.log(flat([[2,3],1,[4,5],[1,2,[3,4],[1,2,[1]]]],1));
// [ 2, 3, 1, 4, 5, 1, 2, [ 3, 4 ], [ 1, 2, [ 1 ] ] ]

6.给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

如: [0,1,0,3,12] => [1,3,12,0,0]

function moveZero(nums){
  var count=0;
  for (let i = 0; i < nums.length; i++) {
    if(nums[i]===0){
      nums.splice(i,1);
      i--;
      count++;
    }
  }
  nums.push(...new Array(count).fill(0))
  return nums
}

7.数据双向绑定实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <input type="text" id="txt">
  <p id="show-txt"></p>
  <script>
    var obj={};
    var writeDom=document.getElementById('txt');
    var showDom=document.getElementById('show-txt');
    Object.defineProperty(obj,'txt',{
      get:function(){
        // console.log(obj[txt]); 
        return obj;
      },
      set:function(newValue){
        showDom.innerHTML=newValue;
        writeDom.value=newValue;
      }
    })
    writeDom.addEventListener('input',function input(e){
        var m=showDom.innerHTML
        obj.txt=e.target.value;

        console.log(`from ${m} to ${writeDom.value}`);

    });

  </script>
</body>
</html>

8.setTimeout 实现打点计时器

题目描述
实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 2秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出


function count(start,end){
  if (start <= end) {
    console.log(start++);
    timer=setTimeout(() => {
      count(start, end)
    }, 2000);
  }
  return {
    cancel:function(){
      clearTimeout(timer);
    }
  }
}
// count(1,5)