Skip to content

常用全局函数

浅拷贝

js
function clone(target) {
    if(typeof target!=='object'){
        return target
    }
    let newTarget=target instanceof Array?[]:{};
    for (let prop in target) {
        // 筛选自身可枚举属性
        if (target.hasOwnProperty(prop)) {
            newTarget[prop] = target[prop]
        }
    }
    return newTarget
}

深拷贝

js
function deepClone(target, hash = new WeakMap()) {
    if (target === null) return target
    if (target instanceof Date) return new Date(target)
    if (target instanceof RegExp) return new RegExp(target)
    // if (target instanceof HTMLElement) return target // 处理 DOM元素
    if (typeof target !== 'object') return target
    //处理循环引用
    if (hash.has(target)) {
        return hash.get(target)
    }
    //获取数组对象的原型[]或者Object对象的原型{}
    const cloneTarget = new target.constructor()
    //同层级创建相应的对象存储数据
    hash.set(target, cloneTarget)
    //遍历数据进行拷贝
    Reflect.ownKeys(target).forEach(key => {
        cloneTarget[key] = deepClone(target[key], hash)
    })
    return cloneTarget
}

new方法

js
function New(){
    var obj = new Object()
    //取出第一个参数
    var constructor = Array.prototype.shift.call(arguments)
    obj.__proto__ = constructor.prototype
    var ret = constructor.apply(obj, arguments)
    // 如果构造函数中return 了对象则返回对象
    return typeof ret === 'object' ? ret : obj
}

instaceOf方法

js
function instaceOf(target, origin) {
    //循环遍历直到找到指定原型返回true,否则返回false
    let proto = target.__proto__
    while (true) {
        if (proto === null) {
            return false
        }
        if (proto === origin.prototype) {
            return true
        }
        proto = proto.__proto__
    }
    // MDN
    /* while (target != null) {
         if (target == origin.prototype)
             return true;
         if (typeof object == 'xml') {
             return origin.prototype == XML.prototype;  //应对XML对象
         }
         target = target.__proto__;
     }
     return false;*/
}

乱序

洗牌算法

js
function shuffle(arr){
    let m = arr.length;
    while (m > 1){
        let index = Math.floor(Math.random() * m--);
        [arr[m] , arr[index]] = [arr[index] , arr[m]]
    }
    return arr;
}

for of实现

js
function forOf(obj,cb) {
    let iterable,result
    //没有遍历器函数直接抛出异常
    if(typeof obj[Symbol.iterator]!=='function'){
        throw new TypeError(result+"is not iterable")
    }
    //取出遍历器函数循环遍历打印所有数据
    iterable=obj[Symbol.iterator]();
    result=iterable.next()
    while(!result.done){
        cb(result.value);
        result=iterable.next();
    }
}

isNaN方法

js
// isNaN方法  功能:用来确定一个值是否为NaN
function isNaN(value) {
    var n = Number(value);
    return n !== n;
}

尾递归

js
//尾递归斐波那契数列
function fibonacci(n , ac1 = 1 , ac2 = 1) {
    if( n <= 1 ) {return ac2}
    return fibonacci(n - 1, ac2, ac1 + ac2);
}

//尾递归阶乘函数
function factorial(n,total=1){
    if(n===1){
        return total
    }
    return factorial(n-1,n*total)
}

子集

js
 //判断是否为包含关系
function isSuperset(set, subset) {
    for (let elem of subset) {
        if (!set.has(elem)) {
            return false;
        }
    }
    return true;
}

并集

js
function union(setA, setB) {
    let _union = new Set(setA);
    for (let elem of setB) {
        _union.add(elem);
    }
    return _union;
}

交集

js
function intersection(setA, setB) {
    let _intersection = new Set();
    for (let elem of setB) {
        if (setA.has(elem)) {
            _intersection.add(elem);
        }
    }
    return _intersection;
}

补集

js
//AB的并集减去AB的交集
function symmetricDifference(setA, setB) {
    let _difference = new Set(setA);
    for (let elem of setB) {
        if (_difference.has(elem)) {
            _difference.delete(elem);
        } else {
            _difference.add(elem);
        }
    }
    return _difference;
}

差集

js
//属于A但不属于B的
function difference(setA, setB) {
    let _difference = new Set(setA);
    for (let elem of setB) {
        _difference.delete(elem);
    }
    return _difference;
}