JS优秀编码欣赏--插件dayjs 变量定义部分欣赏

这个插件的主要功能,就是对日期进行各种处理。虽然看似就是简单对变量定义,但也是经过作者反复打磨之后的,研究起来也很有意义。先上代码。

export const SECONDS_A_MINUTE = 60
export const SECONDS_A_HOUR = SECONDS_A_MINUTE * 60
export const SECONDS_A_DAY = SECONDS_A_HOUR * 24
export const SECONDS_A_WEEK = SECONDS_A_DAY * 7

export const MILLISECONDS_A_SECOND = 1e3
export const MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND
export const MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND
export const MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND
export const MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND

// English locales
export const MS = 'millisecond'
export const S = 'second'
export const MIN = 'minute'
export const H = 'hour'
export const D = 'day'
export const W = 'week'
export const M = 'month'
export const Q = 'quarter'
export const Y = 'year'
export const DATE = 'date'

export const FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ'

// regex
export const REGEX_PARSE = /^(\d{4})-?(\d{1,2})-?(\d{0,2})(.*?(\d{1,2}):(\d{1,2}):(\d{1,2}))?.?(\d{1,3})?$/
export const REGEX_FORMAT = /\[.*?\]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g

export const en = {
  name: 'en',
  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_')
}

日期与秒数转换定义

因为周/时/分/秒的关系是固定的,而且插件的功能决定着它会经常会用到变量之间的转换。作者通过按照最小单位秒来算,从小向大定义, 关系描述的非常清楚,可读性非常好,使用起来也非常方便。

export const SECONDS_A_MINUTE = 60
export const SECONDS_A_HOUR = SECONDS_A_MINUTE * 60
export const SECONDS_A_DAY = SECONDS_A_HOUR * 24
export const SECONDS_A_WEEK = SECONDS_A_DAY * 7

regex 正则表达式

这里定义了两个正则,第一个是将年月日 时分秒 毫秒 通过匹配子项,把不同内容匹配出来。

export const REGEX_PARSE = /^(\d{4})-?(\d{1,2})-?(\d{0,2})(.*?(\d{1,2}):(\d{1,2}):(\d{1,2}))?.?(\d{1,3})?$/
export const REGEX_FORMAT = /\[.*?\]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g

具体解读一下。

  • /^$/: 从开头到结束,中间不允许有多余内容
  • (\d{4}):4位数字,作为一个子项,对应到年
  • -?:可能会有-,也可能没有,这里把是否有 - 这部分也兼容进来,如果没有 - 也不影响。但是 - 并不匹配到子项里
  • (\d{1,2}):第二部分是月分,月份限定在1-2位,这也就说明匹配结果时,月份是必须要有的。
  • (\d{0,2}):日期,日期可以是空的,也可以是1-2位,也就是说,必须要有年月,但是日期可以是空。
  • ()?:时分秒匹配到一个子项内,并且是可有可无的。这里考虑到,有的时候匹配年月日,有的地方要有年月日时分秒。这是两个整块。
  • .*?:时分秒前面的字符。

.*? 与 .*的区别

  • .*:贪婪匹配,匹配时从右向左,从最末尾开始匹配。
  • .*?:最小匹配,满足条件的情况只匹配一次。

举个例子

.*匹配到了最右侧,而.*?匹配到了第一个满足条件的情况。也就保证了这个正则匹配是从前往后一次匹配的。

列表变量的定义

这个定义方式比较特别的,没有按照常规的直接列一个数组,而是用_拼接了一个字符串,然后用split返回的数组,说实话还不是太清楚为啥这么弄。 看起来清晰点?反正最后也是返回一个数组。可能不用弄那么多双引号逗号的,方便点吧。挺有意思。

export const en = {
  name: 'en',
  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_')
}

随机浏览