编辑代码

function add(arg1, arg2) { // 加
    let s1 = arg1.toString();
    let s2 = arg2.toString();
    let arg1Arr = s1.split(".");
    let arg2Arr = s2.split(".");
    let d1 = arg1Arr.length == 2 ? arg1Arr[1] : "";
    let d2 = arg2Arr.length == 2 ? arg2Arr[1] : "";
    let maxLen = Math.max(d1.length, d2.length);
    let m = Math.pow(10, maxLen);
    return Number(((s1 * m + s2 * m) / m).toFixed(maxLen));
}
function sub(arg1, arg2) { // 减
    return this.add(arg1, -arg2);
}
function mul(arg1, arg2) { // 乘
    let m = 0;
    let s1 = arg1.toString();
    let s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
function div(arg1, arg2) { // 除
    let t1 = 0;
    let t2 = 0;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    let r1 = Number(arg1.toString().replace(".", ""));
    let r2 = Number(arg2.toString().replace(".", ""));
    return this.mul((r1 / r2), Math.pow(10, t2 - t1));
}
function uuid() {
    const s4 = () => {
        return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
    };
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
// 6、JS发布订阅模式
const event = {
    clientList: [],
    listen: function (key, fn) {
        if (this.clientListen[key]) {
            this.clientList[key] = []
        }
        this.clientList[key].push(fn)
    },
    trigger: function () {
        const key = Array.prototype.shift.call(arguments)
        const fns = this.clientList[key]
        if (!fns || fns.length === 0) {
            return false
        }
        for (let i = 0, fn; fn = fns[i++];) {
            fn.apply(this, arguments)
        }
    },
    remove: function (key, fn) {
        const fns = this.clientList[key]
        if (!fns) {
            return false
        }
        if (!fn) {
            fns && (fns.length = 0)
        } else {
            for (let l = fns.length - 1; l >= 0; l--) {
                const _fn = fns[l]
                if (_fn === fn) {
                    fns.splice(l, 1)
                }
            }
        }
    }
}
const installEvent = (obj) => {
    for (let i in event) {
        obj[i] = event[i]
    }
}
//  3、JS bind 实现
if (!Function.prototype.bind) {
    Function.prototype.bind = function () {
        var self = this,                        // 保存原函数
            context = [].shift.call(arguments), // 保存需要绑定的this上下文
            args = [].slice.call(arguments);    // 剩余的参数转为数组
        return function () {                    // 返回一个新函数
            self.apply(context, [].concat.call(args, [].slice.call(arguments)));
        }
    }
}
Function.prototype.bind = function (...arg) {
    var self = this;
    var newArr = [...arg];                       // 保存原函数
    var context = newArr.shift(); // 保存需要绑定的this上下文
    return function (...arg2) {
        var arr = [...newArr];
        Array.prototype.push.apply(arr, arg2)
        self.apply(context, arr);
    }
}