1

1、类型判断

判断 Target 的类型,单单用 typeof 并无法完全满足,这其实并不是 bug,本质原因是 JS 的万物皆对象的理论。因此要真正完美判断时,我们需要区分对待:

  • 基本类型(null): 使用 String(null)
  • 基本类型(string / number / boolean /undefined) + function: 直接使用 typeof即可
  • 其余引用类型(Array / Date / RegExp Error): 调用toString后根据[object XXX]进行判断

很稳的判断封装:

let class2type = {}
'Array Date RegExp Object Error'.split(' ').forEach(e => class2type[ '[object ' + e + ']' ] = e.toLowerCase()) 

function type(obj) {
    if (obj == null) return String(obj)
    return typeof obj === 'object' ? class2type[ Object.prototype.toString.call(obj) ] || 'object' : typeof obj
}

2、防抖和节流
摘自https://segmentfault.com/a/11...

  • 防抖 (debounce): 将多次高频操作优化为只在最后一次执行,通常使用的场景是:用户输入,只需再输入完成后做一次输入校验即可。
function debounce(fn, wait, immediate) {
    let timer = null

    return function() {
        let args = arguments
        let context = this

        if (immediate && !timer) {
            fn.apply(context, args)
        }

        if (timer) clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(context, args)
        }, wait)
    }
}
  • 节流(throttle): 每隔一段时间后执行一次,也就是降低频率,将高频操作优化成低频操作,通常使用场景: 滚动条事件 或者 resize 事件,通常每隔 100~500 ms执行一次即可。
function throttle(fn, wait, immediate) {
    let timer = null
    let callNow = true
    
    return function() {
        let context = this,
            args = arguments

        if (callNow) {
            fn.apply(context, args)
            callNow = false
        }

        if (!timer) {
            timer = setTimeout(() => {
                fn.apply(context, args)
                timer = null
            }, wait)
        }
    }
}

3、获取URL参数

function getUrlKey(name){
    return encodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href)||[,""])[1].replace(/\+g,'%20')) || null;
}

4、全局尺寸设置
说明:常用长度单位px、em、rem。其中px是物理像素,固定大小,无自适应特点;em是相对单位,以父元素大小为基准倍率,但累计叠乘,容易出错;rem相对单位,以根元素大小为基准倍率(document.documentElement.style.fontSize),不叠加,可实现准确自适应。

;(function(win,doc){
    function setRem(){
        //以iphone6为标准,按屏幕大小实现屏幕基础尺寸缩放,16px是文档的默认尺寸(即1rem默认为16px),为方便计算可变更为50或者100(对应1rem=50px或者100px)
        doc.documentElement.style.fontSize = 16 * doc.documentElement.clientWidth / 375 + 'px';
    }
    setRem();
    //监听resize事件,屏幕大小发生变化时,随时变换基础尺寸
    win.addEventListener('resize',function(){
        setRem();
    },false);
})(window,document)

5、深拷贝数据
应用类型(array、object)按引用使用,不能复制,想要复制(深拷贝)需要新建对象,把目标的对象的属性逐个拷贝。

function copyArr (arr){
    return arr.map((e) => {
        if(typeof e ==='object'){
            return Object.assign({},e)
        }else {
            return e
        }
    })
}

Fardwn
121 声望2 粉丝

专注技术!