刷刷前端手写题

闭包用途

防抖

描述

        前面所有触发都被取消,最后一次执行,在规定时间之后才会触发,也就是说如果连续快速的触发,用户操作频繁,但只会执行一次

        常用场景:输入框输入

代码实现

1、lodash的debounce函数

2、 当用户点击按钮时,debounce 包装的 getBtnValue 函数会延迟 3000 毫秒执行。如果在这 3000 毫秒内用户再次点击按钮,那么之前的定时器会被清除,重新开始计时。因此,getBtnValue 函数只会在用户停止点击 3000 毫秒后才执行

function debounce(fn,apply){
    let timer;// 初始状态下,timer是undefined
    return function(){
        // 如果timer有值,清除之前的定时器
        if(timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(()=>{
            fn.apply(this,args)
        },delay)
    } 
}
function getValue(e){
    console.log('1111')
}
const btn = document.createElement('button')
btn.innerHTML = 'btn'
document.body.appendChild(btn)
btn.onclick = debounce(getValue, 3000)

         浏览器环境:timer 会被赋值为一个整数,例如 1、2、3 等;Node.js 环境:timer 会被赋值为一个 Timeout 对象。

节流

描述

有规律执行,减少时间执行次数,拖放,滚屏;

只会在第一个点击时执行一次,后续点击将被忽略,直到 delay时间过去后才能再次执行

代码实现

        function throttle(func, delay) {
        let timer; // 用于保存定时器标识符
        return function() {
            if (timer) return; // 如果 timer 已经存在,说明在 delay 时间内已经触发过,直接返回,跳过本次调用
            const args = arguments; // 保存当前的参数
            const context = this; // 保存当前的执行上下文
            
            // 设置一个定时器,在 delay 毫秒后执行 func
            timer = setTimeout(() => {
                func.apply(context, args); // 执行原始函数,传递当前上下文和参数
                timer = null; // 重置 timer,表示可以再次触发 func
            }, delay);
        };
    }
    const btn = document.createElement('button')
    btn.innerHTML = 'btn'
    document.body.appendChild(btn)
    function handleClick() {
        console.log('Button clicked!');
    }

    btn.onclick = throttle(handleClick, 3000);

  • 点击第一次:创建 timer,设置 delay 毫秒后执行 func
  • delay 期间再次点击:由于 timer 存在,函数直接返回,不会再次执行 func
  • delay 时间到达func 被执行,timer 被重置为 null
  • 允许新的点击执行:可以再次创建新的 timer 并触发 func。

因此,尽管多次点击,只有第一次点击时创建的定时器会生效!!

函数柯里化

描述

代码实现

手写New

描述

  new 操作符的主要作用是生成一个新对象,并将这个对象与构造函数的原型连接起来,同时构造函数中的代码会在新对象的上下文中执行,给新对象赋予属性和方法。

主要流程是:const person1 = new Person('Alice', 25);

  • 新建一个对象const person1 = {};
  • 设置原型person1.__proto__ = Person.prototype;//隐式原型指向构造函数的显示原型
  • 绑定 this:执行 Person 构造函数时,this 被绑定到 person1
  • 执行构造函数:在 Person 函数中,this.name = name;name 赋值给 person1
  • 返回对象:如果没有显式返回对象,new 操作符会返回 person1

代码实现

function Person(a){
    this.a=a
}
function myNew(fn,...args){
    const obj={};
    obj._proto_=fn.prototype
    fn.apply(obj,args)
    return obj
}
const obj = myNew(Person,123)

数组去重

描述

顾名思义:console.log(uniqueArray([1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5])); // [1, 2, 3, 4, 5, 6]

代码实现

const uniqueArray = (arr) => {
    return [...new Set(arr)]
}

实现正则切分千分位(js)

描述

顾名思义:console.log(formatThousands(123456789)); // 输出: 123,456,789

代码实现

function format(num){
    //将数字转为字符串并分割整数和小数部分
    let arr = String(num).split(.)
    let char = arr[0].split('').reverse()
    return char.reduce((pre,cur,curIndex)=>{
        if(curIndex+1) %3 ===0 && curIndex !==char.length -1){
            return ','+cur+pre
        }
        return cur+pre
    },"")    
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
postcss-px-to-viewport是一个PostCSS插件,用于将CSS中的像素单位(px)转换为视口单位(vw、vh、vmin、vmax)。它可以帮助开发者在移动端适配中解决不同设备屏幕尺寸带来的问。 当你的CSS文件中的像素单位被格式化为px时,可能是由于使用了其他工具或插件对CSS进行了处理。如果你想使用postcss-px-to-viewport来进行单位转换,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了postcss-px-to-viewport插件。可以通过npm或yarn进行安装。 2. 在你的项目中找到PostCSS的配置文件(通常是postcss.config.js或者.postcssrc.js),在该文件中添加postcss-px-to-viewport插件的配置。 例如: ```javascript module.exports = { plugins: [ require('postcss-px-to-viewport')({ viewportWidth: 750, // 视口的宽度,单位为px viewportHeight: 1334, // 视口的高度,单位为px unitPrecision: 3, // 转换后的视口单位保留的小数位数 viewportUnit: 'vw', // 转换的视口单位 selectorBlackList: ['.ignore'], // 需要忽略的CSS选择器,不进行转换 minPixelValue: 1, // 小于或等于1px不进行转换 mediaQuery: false // 是否在媒体查询中也进行转换 }) ] } ``` 3. 配置完成后,重新编译你的CSS文件,插件会自动将像素单位转换为视口单位。 如果你的CSS文件中的像素单位被格式化为px,可以尝试检查是否有其他插件或工具对CSS进行了处理,并确保postcss-px-to-viewport插件已正确配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值