常用js函数

日期格式化函数

调用示例
var time1 = new Date().Format("yyyy-MM-dd"); 2017-12-20
var time2 = new Date().Format("yyyy-MM-dd hh:mm:ss"); 2017-12-30 10:10:10
var time3 = new Date('2017-01-09 12:30').Format("yyyyMMddhhmm"); 201701091230


Date.prototype.Format = function(fmt) {
    var o = {
        'M+': this.getMonth() + 1, // 月份
        'd+': this.getDate(), // 日
        'h+': this.getHours(), // 小时
        'm+': this.getMinutes(), // 分
        's+': this.getSeconds(), // 秒
        'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
        'S': this.getMilliseconds() // 毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.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;
};

对象深拷贝

  // 对象深拷贝
    deepClone(source) {
        var that = this;
        if (!source && typeof source !== 'object') {
            throw new Error('error arguments', 'shallowClone');
        }
        const targetObj = source.constructor === Array ? [] : {};
        Object.keys(source).forEach((keys) => {
            if (source[keys] && typeof source[keys] === 'object') {
                targetObj[keys] = source[keys].constructor === Array ? [] : {};
                targetObj[keys] = that.deepClone(source[keys]);
            } else {
                targetObj[keys] = source[keys];
            }
        });
        return targetObj;
    },

重写toFixed解决偶数奇数toFixed自带bug(兼容负数)

问题原因:https://www.cnblogs.com/zazahao/p/10705411.html

例:1.335.toFixed(2) // 1.33

Number.prototype.toFixed = function(s) {
    let _this=this;
    if (this<0) {
        _this=-this;
    }
    var changenum = (parseInt(_this * Math.pow(10, s) + 0.5)/ Math.pow(10, s)).toString();
    var index = changenum.indexOf('.');
    if (index < 0 && s > 0) {
        changenum=changenum+'.';
        for (let i = 0; i < s; i++) {
            changenum = changenum+'0';
        }
    } else {
        index = changenum.length - index;
        for (let i = 0; i < (s - index) + 1; i++) {
            changenum = changenum + '0';
        }
    }
    return this<0?-changenum:changenum;
};

数组处理

apply
let arr=[1,2,[3,4],5]
let a=Array.prototype.concat.apply([], arr)
console.log(a) //  [ 1, 2, 3, 4, 5 ]
递归实现数组的扁平化
function flatten(arr) {
    var res = [];
    arr.map(item => {
        if(Array.isArray(item)) {
            res = res.concat(flatten(item));
        } else {
            res.push(item);
        }
    });
    return res;
}

 //将需要转化的数组,以及最后需要返回的数组进行传参
function flatten(array,result = []){ 
//循环数组中的每一项,如果这一项是数组,则再次调用这个函数,
//否则直接将这项push到结果中,并且return出来
     for(var i of array){  
         if(Array.isArray(i)){
             flatten(i,result)
         }else{
           result.push(i)
         }
     }
     return result;
 }
手动实现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)));
        }
    }
}

怎么实现对象深拷贝

let o1 = {a:{
    b:1
  }
}
let o2 = JSON.parse(JSON.stringify(o1))
另一种方法

function deepCopy(s) {
    const d = {}
    for (let k in s) {
        if (typeof s[k] == 'object') {
            d[k] = deepCopy(s[k])
        } else {
            d[k] = s[k]
        }
    }

    return d
}

数组去重

ES5
function unique(arry) {
    const temp = []
    arry.forEach(e => {
        if (temp.indexOf(e) == -1) {
            temp.push(e)
        }
    })
    return temp
}
ES6
function unique (arr) {
   return Array.from(new Set(arr))
}
防抖函数

如果在Vue中使用,建议如下赋值

mounted(){
  this.yourMethod =  debounce(()=>{
    // 业务代码
  },200)
}
function debounce(func, wait, immediate) {
    let timer;
    return function() {
      let context = this,
          args = arguments;
           
      if (timer) clearTimeout(timer);
      if (immediate) {
        let callNow = !timer;
        timer = setTimeout(() => {
          timer = null;
        }, wait);
        if (callNow) func.apply(context, args);
      } else {
        timer  = setTimeout(() => {
          func.apply
        }, wait)
      }
    }
}
节流函数
/**
 * @desc 函数节流
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param type 1 表时间戳版,2 表定时器版
 */
function throttle(func, wait, type) {
  if (type === 1) {
    let previous = 0;
  } else if (type === 2) {
    let timeout;
  }
  return function() {
    let context = this;
    let args = arguments;
    if (type === 1) {
        let now = Date.now();
 
        if (now - previous > wait) {
          func.apply(context, args);
          previous = now;
        }
    } else if (type === 2) {
      if (!timeout) {
        timeout = setTimeout(() => {
          timeout = null;
          func.apply(context, args)
        }, wait)
      }
    }
  }
}

防抖与节流参考文档

格式化金钱,每千分位加逗号

function format(str) {
    let s = ''
    let count = 0
    for (let i = str.length - 1; i >= 0; i--) {
        s = str[i] + s
        count++
        if (count % 3 == 0 && i != 0) {
            s = ',' + s
        }
    }
    return s
}
function format(str) {
    return str.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')
}
柯里化函数
function add(x) {
    var sum = x;
    var tmp = function (y) {
        sum = sum + y;
        return tmp;
    };
    tmp.toString = function () {
        return sum;
    };
    return tmp;
}
console.log(add(1)(2)(3));  //6

你可能感兴趣的:(常用js函数)