第五章 引用类型 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);
- Date.parse() 根据传入字符串返回相应日期毫秒数
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 正则表达式