zoukankan      html  css  js  c++  java
  • web前端自定义函数工具库

    1、call函数封装实现

    // 手写call函数
    function call(Fn,obj,...arg){
        // 如果obj为null或者undefined,则指向window
        if(obj === undefined || obj === null){
            // globalThis是ES11的新特性,指向全局
            obj = globalThis
        }
        //为obj添加临时方法
        obj.temp = Fn
        // 调用 temp 方法
        let result = obj.temp(...arg)
        // 删除obj 的 temp 
        delete obj.temp
        return result
    }
    
    function add(a,b){
        console.log(this);
        return a + b + this.c
    }
    let obj = {
        c:521
    }
    globalThis.c = 1314
    console.log(call(add,obj,10,20)); //551
    console.log(call(add,null,10,20)); //1344
    // 手写call函数
    Function.prototype.call = function(obj,...arg){
        // 如果obj为null或者undefined,则指向window
        if(obj === undefined || obj === null){
            // globalThis是ES11的新特性,指向全局
            obj = globalThis
        }
        //为obj添加临时方法
        obj.temp = this
        // 调用 temp 方法
        let result = obj.temp(...arg)
        // 删除obj 的 temp 
        delete obj.temp
        return result
    }
    function add(a,b){
        console.log(this);
        return a + b + this.c
    }
    let obj = {
        c:521
    }
    globalThis.c = 1314
    console.log(add.call(obj,10,20)); //551
    console.log(add.call(null,10,20)); //1344

    2、apply函数封装实现

    // 手写apply函数
    Function.prototype.apply = function(obj,arg){
        if(obj === null || obj === undefined){
            obj = globalThis
        }
        obj.temp = this
        let result = obj.temp(...arg)
        delete obj.temp
        return result
    }
    function add(a,b){
        console.log(a+b+this.c);
    }
    let obj = {
        c:1314
    }
    globalThis.c = 520
    add.apply(obj,[10,20]) //1344
    add.apply(null,[10,20]) //550

    3、bind函数封装实现(bind不会立刻执行)

    function bind(Fn,obj,...args){
        if(obj === null || obj === undefined){
            obj = globalThis
        }
        //bind返回一个函数,调用的时候执行方法
        return function(...args2){
            // 调用call方法
            obj.temp = Fn
            let result = obj.temp(...args,...args2)
            delete obj.temp
            return result
        }
    }
    function add(a,b){
        console.log(arguments);
        console.log(a+b+this.c);
    }
    let obj = {
        c:1314
    }
    globalThis.c = 520
    bind(add,obj,10,20)() //1344
    bind(add,null,10,20)(30,40) //550

    4、函数节流

    throttle节流

    语法:throttle(callback,wait)

    功能:创建一个节流函数,在wait毫秒内最多执行callback一次

    理解:在函数需要频繁触发时:函数执行一次后,只有大于设定的执行周期后才会执行第二次,适合多次事件按时间做平均分配触发

    场景:窗口调整(resize)、页面滚动(scroll)、DOM元素的拖拽功能实现(mousemove)、抢购疯狂点击(click)

    <script>
            window.addEventListener(‘scroll‘,throttle(function(){
                console.log(Date.now());
            },500))
            function throttle(callback,wait){
                // 定义开始时间
                let start = 0
                // 返回结果是一个函数
                return function(e){
                    let now = Date.now()
                    if(now - start > wait){
                        callback.call(this,e)
                        start = now
                    }
                }
            }
     </script>

     5、函数防抖

    语法:debounce(callback,wait)

    功能:创建一个防抖动函数,该函数会从上一次被调用后,延迟wait毫秒后调用callback

    理解:触发了一次函数会在延迟wait毫秒后调用callback,但再次点击,会清空掉再次计算

    场景:input框输入时

    <body>
        <input type="text">
        <script>
            let input = document.querySelector(‘input‘)
            // input.onkeydown = function(e){
            //     console.log(e.keyCode);
            // }
            input.onkeydown = debounce(function(e){
                console.log(e.keyCode);
            },1000)
            function debounce(callback,time){
                //定时器变量
                let timeId = null
                // 返回值一定是个函数,否则无法触发回调
                return function(e){
                    //timeId !== null 证明已经有一个timeif在跑,先清除掉再继续跑
                    if(timeId !== null){
                        clearTimeout(timeId)
                    }
                    //启动定时器
                    timeId = setTimeout(()=>{
                        callback.call(this,e)
                        // 重置定时器变量
                        timeId = null
                    },time)
                    
                }
            }
        </script>
    </body>

    6、数组函数map封装实现

    map()方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值

    const arr = [1,2,3,4,5]
    Array.prototype.map = function (callback) {
        let result = []
        for(let i = 0;i<this.length;i++){
            result.push(callback(this[i],i))
        }
        return result
    }
    let arr2 = arr.map((item,index) => {
        return item *10
    })
    console.log(arr2);

    7、数组函数reduce封装实现

    reduce():从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值

    const arr = [1,2,3,4,5]
    // 示例
    let result = arr.reduce((res,value)=>{
        return res + value
    },0) //0为res初始值,value为arr的值
    console.log(result); //15
    
    Array.prototype.reduce = function(callback,value){
        let result = value
        for(let i = 0;i<this.length;i++){
            result = callback(result,this[i])
        }
        return result
    }
    //  演示
    let arr2 = arr.reduce((res,value)=>{
        return res + value
    },5)
    console.log(arr2);

    8、数组函数filter封装实现

    filter():将所有在过滤函数中返回true的数组元素放进一个新数组中并且返回

    const arr = [1,2,3,4,5]
    Array.prototype.filter2 = function(callback){
        let arr = []
        for(let i = 0;i<this.length;i++){
            if(callback(this[i],i)){
                arr.push(this[i])
            }
        }
        return arr
    }
    let res = arr.filter2((item=>{
        return item > 2
    }))
    console.log(res);

    8、数组函数find封装实现

    find():找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回undefined

    const arr = [1,2,3,2005,4,1001]
    // find()
    Array.prototype.find = function(callback){
        for(let i = 0;i<this.length;i++){
            if(callback(this[i],i)){
                return this[i]
            }
        }
        return undefined
    }
    let res = arr.find((item=>{
        return item > 3000
    }))
    console.log(res);

    9、数组函数findIndex封装实现

    findIndex():找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回-1

    // findIndex()
    Array.prototype.findIndex2 = function(callback){
        for(let i = 0;i<this.length;i++){
            if(callback(this[i],i)){
                return i
            }
        }
        return -1
    }
    let res = arr.findIndex2((item=>{
        return item > 1000
    }))
    console.log(res);

    10、数组函数every封装实现

    every():如果数组中的每个元素都满足测试函数,则返回true,否则返回false

    const arr = [1,2,3,4,5]
    Array.prototype.every2 = function(callback){
        for(let i = 0;i<this.length;i++){
            let result = callback(this[i],i)
            if(!result){
                return false;
            }
        }
        return true
    }
    const result = arr.every2(item=>{
        return item > 0
    })
    console.log(result);

    11、数组函数some封装实现

    some():如果数组中至少有一个元素满足测试函数,则返回true,否则返回false

    Array.prototype.some2 = function(callback){
        for(let i = 0;i<this.length;i++){
            let result = callback(this[i],i)
            if(result){
                return true
            }
        }
        return false;
    }
    const result = arr.some2(item=>{
        return item > 6
    })
    console.log(result);

    12、数组去重

    方法1:利用foreach()和indexOf()

    方法2:利用froecah() + 对象容器

    方法3:利用ES6语法:from + Set 或者 ... + Set

    const arr = [1,2,3,4,5,2,4]
    // 方法1 :forEach + indexOf 
    function unique(arr){
        if(!Array.isArray(arr)){
            return
        }
        let result = []
        arr.forEach(item=>{
            if(result.indexOf(item) === -1){
                result.push(item)
            }
        })
        return result
    }
    let result = unique(arr)
    console.log(result);
    // 方法2 forEach() + 对象容器
    function unique2(arr){
        let result = []
        //声明空对象
        const obj = {}
        arr.forEach(item => {
            if(obj[item] === undefined){
                obj[item] = true
                result.push(item)
            }
        })
        console.log(obj);
        return result
        
    }
    let result2 = unique2(arr)
    console.log(result2);
    //方法3:利用ES6语法:from + Set 或者 ... + Set
    function unique3(arr){
        return [...new Set(arr)]
        // let result = Array.from(new Set(arr))
        // return result
    }
    let result3 = unique3(arr)
    console.log(result2);

    13、数组合并和切片

    数组合并concat()

    let arr = [1,2,3]
    Array.prototype.concat2 = function(...args){
        let result = [...this,...args]
        return result
    }
    const result = arr.concat2([4,5,6],7,8)
    console.log(result);

    数组切片slice()

    Array.prototype.slice2 = function(begin,end){
        if(this.length === 0){
            return [];
        }
        //判断begin
        begin = begin || 0
        if(begin >= this.length){
            return [];
        }
        //判断end
        end = end || this.length
        if(end <begin){
            end = this.length
        }
        let result = []
        this.forEach((item,index)=>{
            if(index >= begin && index < end){
                result.push(item)
            }
        })
        return result
    }
    let sliceResult = arr.slice2(1,6)
    console.log(sliceResult);

    http://www.ssnd.com.cn 化妆品OEM代加工

    14、数组扁平化

    语法:flatten(array)

    取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中

    例如:[ 1,[ 3,[ 2,4 ]]]  -> [1,2,3,4]

    方法1: 递归 + reduce() + concat()

    方法2: ,,, + some()  + concat() 

    let arr = [1,2,[3,4,[5,6]],7]
    // 方法1
    function falttenl(arr){
        let result = []
        arr.forEach(item => {
            if(Array.isArray(item)){
                result = result.concat(falttenl(item))
            }else{
                result = result.concat(item)
            }
        });
        return result
    }
    console.log(falttenl(arr));
    // 方法2
    function flatten2(arr){
        let result = [...arr]
        while(result.some(item => Array.isArray(item))){
            result = [].concat(...result)
        }
        return result
    }
    console.log(flatten2(arr));

    15、数组分块

    语法:chunk(array,size)

    功能:将数组拆分成多个size长度的区块,每个区块组成小数组,整体组成一个二维数组

    如:[1,2,3,4,5,6]调用chunk(arr,4) ===> [[1,2,3,4],[5,6]]

  • 相关阅读:
    英语46级CET外语大学词汇
    TOEFL词汇笔记英语托福英语
    19道常见的JS面试算法题
    Vue.js---指令与事件、语法糖
    Qt--多线程间的互斥
    const关键字总结
    Numpy和Pandas的使用入门
    python爬虫爬取天气数据并图形化显示
    JCEF-鼠标右键菜单
    JCEF-tab形式展示浏览器
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/15012355.html
Copyright © 2011-2022 走看看