高效,易读.
1. 高效代码,一次遍历,时间复杂度为O(n) (不追求性能可以直接用replace)
2. 日期解析,使用解构
3. 逐个字符进行处理, 匹配一位和两位字符数据。
4. 需要对yy和yyyy进行特殊处理
function formatDate(dat, format) {
  let [
    yyyy, M, d, H, m, s, w
  ] = [
      dat.getFullYear() + '',
      (dat.getMonth() + 1) + '',
      dat.getDate() + '',
      dat.getHours() + '',
      dat.getMinutes() + '',
      dat.getSeconds() + '',
      ['日', '一', '二', '三', '四', '五', '六'][dat.getDay()],
    ];
  // 使用padStart方法,如果不足两位,前面补0
  // let pad = (str, len) => str.padStart(len, '0');
  let pad = (str, len) => ('0' + str).slice(-2);
  let datMap = {
    yyyy: yyyy,
    yy: yyyy.slice(2),
    MM: pad(M, 2),
    M,
    dd: pad(d, 2),
    d: d,
    HH: pad(H, 2),
    H: H,
    hh: pad(H % 12 + '', 2),
    h: (H % 12 + ''),
    mm: pad(m, 2),
    m,
    ss: pad(s, 2),
    s,
    w
  };
  let firstChar = '';
  let yNum = 0;
  let res = [];
  for (let c of format) {
    if (c == 'y') {
      if (firstChar) {
        res.push(datMap[firstChar] || firstChar);
        firstChar = '';
      }
      yNum++;
    } else {
      // 处理y字符, yy,yyyy对应数据.
      res.push(datMap['y'.repeat(yNum)] || 'y'.repeat(yNum));
      yNum = 0;

      // 处理非y字符, 2位字符合并
      if (!datMap[c]) {
        if (firstChar) {
          res.push(datMap[firstChar] || firstChar);
          firstChar = '';
        }
        res.push(c);
      } else {
        if (!firstChar) firstChar = c;
        else {
          if (firstChar != c) {
            res.push(datMap[firstChar]);
            firstChar = c;
          } else {
            res.push(datMap[c + c] || (c + c));
            firstChar = '';
          }
        }
      }
    }
  }
  if (firstChar) res.push(datMap[firstChar] || firstChar);
  return res.join('');
}