日期格式化函数
调用示例
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