第五章 引用类型 5.3Date - 5.4RegExp

[TOC]

5.3 Date类型

  • ECMASCript的Date类型是早起Java中java.util.Date基础上构建的
  • 所以使用UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数保存日期
  • 创建当前日期对象
var now = new Date(); //Sat Aug 31 2019 15:43:19 GMT+0800 (中国标准时间)
  • 创建指定日期对象
    • Date.parse() 根据传入字符串返回相应日期毫秒数
      • 6/13/2004 --------- 月/日/年
      • January 12,2004 --------- 英文月 日 年
      • Sat Aug 31 2019 15:43:19 GMT+0800 --------- 英文星期 月 日 年 时:分:秒 时区
      • 2004-05-24T00:00:00 --------- ISO8601格式 YYYY-MM-DDTHH:mm:ss.sssZ
      • 不能表示日期时 返回NaN
      var someDate = new Date(Date.parse("May 25,2004")); 
      var someDate1 = new Date("May 25,2004"); //后台也会调用Data.parse()
      
    • Date.UTC() 根据传入字符串返回相应日期毫秒数
      var y2k = new Date(Date.UTC(2000, 0)); //GTM 2000年1月1日
      var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); //GTM 2005年5月5日下午5:55:55
      
      var y2k = new Date(2000, 0); //本地 2000年1月1日
      var allFives = new Date(2005, 4, 5, 17, 55, 55); //本地 2005年5月5日下午5:55:55
      
    • Date.now();
      • IE9+ ...
      //开始时间
      var start = Date.now();
      for(var i=0; i<1000000; i++){
          continue;
      }
      var stop = Date.now();
      console.log(stop - start);
      
      • 不兼容浏览器
      //开始时间
      var start = +new Date();
      for(var i=0; i<1000000; i++){
          continue;
      }
      var stop = +new Date();
      console.log(stop - start);
      

5.3.1 继承的方法

  • 和其他引用类型一样,Date重写了toLocaleString() toString() valueOf()
  • toLocaleString() toString() 不同浏览器返回差异大(不常用 一般用于调试)
var now = new Date();
now.toLocaleString(); // "2019/8/31 下午4:10:16"
now.toString() //"Sat Aug 31 2019 16:10:16 GMT+0800 (中国标准时间)"
  • valueOf() 返回日期毫秒 多用于比较
var date1 = new Date(2007, 0, 1);
var date2 = new Date(2007, 1, 1);
console.log(date1 < date2); //true

5.3.2 日期格式化

  • toUTCString(): ECMAScript推荐
  • toGMTString()
  • toDateString()
  • toTimeString()
  • toLocaleDateString()
  • toLocaleTimeString()
  • 不同浏览器返回有差异
console.log(now.toUTCString()); //Sat, 31 Aug 2019 08:10:16 GMT
console.log(now.toGMTString()); //Sat, 31 Aug 2019 08:10:16 GMT
console.log(now.toDateString()); //Sat Aug 31 2019
console.log(now.toTimeString()); //16:10:16 GMT+0800 (中国标准时间)
console.log(now.toLocaleDateString()); //2019/8/31
console.log(now.toLocaleTimeString()); //下午4:10:16

5.3.3 日期/时间组件方法

方法 描述
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)
getMonth() 从 Date 对象返回月份 (0 ~ 11)
getFullYear() 从 Date 对象以四位数字返回年份
getHours() 返回 Date 对象的小时 (0 ~ 23)
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)
getYear() 请使用 getFullYear() 方法代替
getTime() 返回 1970 年 1 月 1 日至今的毫秒数
getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差
getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)
getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)
getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)
getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份
getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)
getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)
getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)
getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)
parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)
setMonth() 设置 Date 对象中月份 (0 ~ 11)
setFullYear() 设置 Date 对象中的年份(四位数字)
setYear() 请使用 setFullYear() 方法代替
setHours() 设置 Date 对象中的小时 (0 ~ 23)
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)
setTime() 以毫秒设置 Date 对象
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)
setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)
setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)
setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)
toSource() 返回该对象的源代码
toString() 把 Date 对象转换为字符串
toTimeString() 把 Date 对象的时间部分转换为字符串
toDateString() 把 Date 对象的日期部分转换为字符串
toGMTString() 请使用 toUTCString() 方法代替
toUTCString() 根据世界时,把 Date 对象转换为字符串
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串
UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数
valueOf() 返回 Date 对象的原始值

5.4 RegExp类型

  • var expression = / pattern / flags
  • flags类型
    • g: 全局匹配
    • i: 不区分大小写
    • m: 多行模式

字面量形式

/*
* 匹配所有"at"
*/
var pattern1 = /at/g;
pattern1.test("asdfjlasdfat"); //true

/*
* 不区分大小写 匹配第一个bat或cat
*/
var pattern2 = /[bc]at/i;

/*
* 不区分大小写 匹配全部以at为结尾的三个字符串
*/
var pattern3 = /.at/gi;

/*
* 不区分大小写 匹配全部以.at
*/
var pattern3 = /\.at/gi;

RegExp构造函数形式

var pattern1 = /[bc]at/i;
var pattern2 = new RegExp("[bc]at","i")
  • 区别:ES3中 字面量形式共享一个RegExp实例 而构造函数创建的实例都是新实例。ES5已修复
var re = null, i;
for(i=0; i<10; i++){
	re = /cat/g;
	re.test("catqwerqer");
	//第二次调用test 索引会从3开始 所以会找不到
    //第三次回到开头,这次找得到
} 
for(i=0; i<10; i++){
	re = new RegExp("cat","g");
	re.test("catqwerqer");
	//始终找得到
}

字面量 等价的字符串
/[bc]at/ "\[bc\]at"
/.at/ "\.at"
/name/age/ "name\/age"
/\d.\d{1,2}/ "\d.\d{1,2}"
/\w\hello\123 "\w\\hello\\123"

5.4.1 RegExp实例属性

  • 一般用处少
var pattern1 = /\[bc\]at/i;
console.log(pattern1.global);  //false
console.log(pattern1.ignoreCase);  //true
console.log(pattern1.multiline);  //false
console.log(pattern1.lastIndex);  //0
console.log(pattern1.source);  //"\[bc\]at"

var pattern2 = new RegExp("\\[bc\\]at","i");
console.log(pattern2.global);  //false
console.log(pattern2.ignoreCase);  //true
console.log(pattern2.multiline);  //false
console.log(pattern2.lastIndex);  //0
console.log(pattern2.source);  //"\[bc\]at"

5.4.2 RegExp实例方法

exec()
  • 为捕获组而生,接收一个应用模式字符串,返回一个匹配的数组
  • 无匹配项返回null 返回的数组有两个属性:index和input
  • index表示匹配项在字符串中位置 input表示字符串本身
  • 每次只返回一个匹配项
    • 如果没有全局标识,同一字符串多次调用始终返回第一次匹配项。
    • 如果有全局标识,每次调用exec会在字符串中继续查找
var str = "cat, bat, sat, fat";
var pattern1 = /.at/;

var matches = pattern1.exec(str);
console.log(matches.index); //0
console.log(matches.input); //"cat, bat, sat, fat"
console.log(matches[0]); //cat
console.log(pattern1.lastIndex); //0

matches = pattern1.exec(str);
console.log(matches.index); //0
console.log(matches.input); //"cat, bat, sat, fat"
console.log(matches[0]); //cat
console.log(pattern1.lastIndex); //0
var str = "cat, bat, sat, fat";
var pattern2 = /.at/g;
var matches = pattern2.exec(str);
console.log(matches.index); //0
console.log(matches.input); //"cat, bat, sat, fat"
console.log(matches[0]); //cat
console.log(pattern2.lastIndex); //3
  • 全局模式下 lastIndex每次调用exec后会增加,非全局模式保持不变
  • 特殊:IE全局模式下 lastIndex每次调用exec后会变化
test()
  • 接收一个应用模式字符串,返回一个匹配的数组,返回true或false
var str = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(str)){
    console.log('right number')
}
  • RegExp继承
    • toLocaleString() toString() 返回表达式字面量
    • valueOf() 返回正则表达式本身
var pattern = new RegExp("\[.at\]","gi");
console.log(pattern.toString());// /[.at]/gi
console.log(pattern.toLocaleString());// /[.at]/gi
console.log(pattern.valueOf());// /[.at]/gi

5.4.3 RegExp构造函数属性

var str = "this has been a short summmer";
var pattern = /(.)hort/g;
if(pattern.test(str)){
    console.log(RegExp.input); // this has been a short summmer
    console.log(RegExp.leftContext); // this has been a 
    console.log(RegExp.rightContext); //  summmer
    console.log(RegExp.lastMatch); // short
    console.log(RegExp.lastParen); // s
    console.log(RegExp.multiline); // false
}
  • 9个存储捕获组
var str = "this has been a short summmer";
var pattern = /(..)or(.)/g;
if(pattern.test(str)){
    console.log(RegExp.$1); //sh
    console.log(RegExp.$2); //t
}

5.4.4 模式的局限性

  • 虽然比较完备,仍然缺少一些高级正则表达式特性

  • 已经非常强大,可完成绝大多数匹配任务

  • 【拓展】 5.4 正则表达式

posted @ 2019-10-08 17:53  KevinTseng  阅读(74)  评论(0编辑  收藏  举报