/**
 * 删除数组某个值
 * @param {*} arr 
 * @param {*} val 
 */
function remove(arr, val) {
    var index = arr.indexOf(val);
    if (index > -1) {
        arr.splice(index, 1);
    }
    return arr;
}
/**
 * 判断两个对象是否相等
 * @param {*} a 
 * @param {*} b 
 */
function isEqual(a,b){
    //如果a和b本来就全等
    if(a===b){
        //判断是否为0和-0
        return a !== 0 || 1/a ===1/b;
    }
    //判断是否为null和undefined
    if(a==null||b==null){
        return a===b;
    }
    //接下来判断a和b的数据类型
    var classNameA=Object.prototype.toString.call(a),
    classNameB=Object.prototype.toString.call(b);
    //如果数据类型不相等，则返回false
    if(classNameA !== classNameB){
        return false;
    }
    //如果数据类型相等，再根据不同数据类型分别判断
    if(classNameA === '[object RegExp]' || (classNameA === '[object String]')) {
        //进行字符串转换比较
        return '' + a ==='' + b;
    }
    if(classNameA === '[object Number]') {
        //进行数字转换比较,判断是否为NaN
        if(a.toString !== 'NaN'){
            return a === b;
        }else {
            //判断是否为0或-0
            return +a === 0?1/ +a === 1/b : +a === +b;
        }
    }
    if(classNameA === '[object Date]' || classNameA === '[object Boolean]') {
        return +a === +b;
    }
    // switch(classNameA){
    //     case '[object RegExp]':
    //     case '[object String]':
    //     //进行字符串转换比较
    //     return '' + a ==='' + b;
    //     case '[object Number]':
    //     //进行数字转换比较,判断是否为NaN
    //     if(a.toString !== 'NaN'){
    //         return a === b;
    //     }
    //     //判断是否为0或-0
    //     return +a === 0?1/ +a === 1/b : +a === +b;
    //     case '[object Date]':
    //     case '[object Boolean]':
    //     return +a === +b;
    //     default : {
    //         return false
    //     }
    // }
    //如果是对象类型
    if(classNameA === '[object Object]'){
        //获取a和b的属性长度
        var propsA = Object.getOwnPropertyNames(a),
        propsB = Object.getOwnPropertyNames(b);
        if(propsA.length !== propsB.length){
            return false;
        }
        for(var i=0;i<propsA.length;i++){
            var propName=propsA[i];
            //如果对应属性对应值不相等，则返回false
            //if(a[propName] !== b[propName]){
            if(!isEqual(a[propName], b[propName])){
                return false;
            }
        }
        return true;
    }
    //如果是数组类型
    if(classNameA === '[object Array]'){
        let i = 0;
        for(i; i < a.length;i++) {
            if(!isEqual(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }
}

function getUrlParam(name) {   
    var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)");   
    var r = window.location.search.substr(1).match(reg);   
    if (r != null) return decodeURI(r[2]); 
    return null;   
}

function hashcode(obj) {
    let str = JSON.stringify(obj);
    let hash = 0,
        i, chr, len;
    if (str.length === 0) return hash;
    for (i = 0, len = str.length; i < len; i++) {
        chr = str.charCodeAt(i);
        hash = ((hash << 5) - hash) + chr;
        hash |= 0;
    }
    return hash;
}

function delay(timeout) {
    return new Promise(resolve => {
        setTimeout(resolve, timeout);
    });
}

export { remove, isEqual, getUrlParam, hashcode, delay, dateFormat };

function dateFormat(date, fmt) {
    date = new Date(date);
    var o = {
        "M+": date.getMonth() + 1, //月份   
        "d+": date.getDate(), //日   
        "h+": date.getHours(), //时   
        "m+": date.getMinutes(), //分   
        "s+": date.getSeconds(), //秒   
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度   
        "S": date.getMilliseconds() //毫秒   
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}