为Date添加add方法

昨天到美团酒旅面试前端,二面惨不忍睹,各种手写polyfill,感觉被笔试,却有心有不甘,有劲使不出来的感觉。如果没有把涉及到js的各种方法、框架原理、包括正则表达式烂熟于心的话,真的很惨。以下我就把自己没有写出来或者写的烂的问题解答出来

面试官要求为Date添加一个add方法,实现new Date().add(‘+1Y-1M+1D’),这种类似的方法博主不常写,项目中一般都是写在util里。这种题目有很多种写法,但是最方便快捷的莫过于用正则,博主正则差的一逼,往往都是现用现查,现场答的一塌糊涂,后来回到自己电脑前试着写了写,一个像

1
/((?:\+|-)\d+)(Y)/

这样正则表达式,整整搞了20分钟才弄对,可想而知让我用白板笔手写该有多惨

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* author: hughdai
* Date add方法
* 实现类似new Date.add('+1Y-1M+1D'),参数可以是年月日,也可以是年月日的组合或者是单独的年月日
* @type {Function}
*/
Date.prototype.add = Date.prototype.add || function (fmt) {
var o = {
'Y': this.getUTCFullYear(),
'M': this.getUTCMonth(),
'D': this.getUTCDate()
};
var number,char;
for(var k in o){
if(new RegExp("((?:\\+|-)\\d+)" + "(" + k + ")").test(fmt)){
number = Number(RegExp.$1);
char = RegExp.$2;
switch(char){
case 'Y':
this.setUTCFullYear(o[k] + number);
break;
case 'M':
this.setUTCMonth(o[k] + number);
break;
case 'D':
this.setUTCDate(o[k] + number);
break;
}
}
}
return this;
}
console.log(new Date().add('+1Y'))
console.log(new Date().add('+1M'))
console.log(new Date().add('+1D'))
console.log(new Date().add('+1Y-1M-1D'))