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)