您的位置:首页 > Web前端 > JavaScript

《JavaScript高级编程》读书笔记——引用类型二:Date和RegExp

2015-11-26 16:34 603 查看
3.Date类型
Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285616年。
创建一个日期对象:
var now=new Date();
在调用Date构造函数而不传递参数的情况下,自动获得当前日期和时间。如果想根据特定的日期和时间创建日期,必须传入表示该日期的毫秒数(即从1970年1月1日午夜起至该日期止经过的毫秒数)。为了简化这一计算过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC()。
Date.parse()接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。ECMA-262没有定义Date.parse()应该支持那种格式,因此这个方法的行为因实现而异,通常因地区而异。将地区设置为美国的浏览器通常都接受下列日期格式:

"月/日/年",如11/26/2015;

"英文月名 日,年",如November 26,2015;

"英文星期几 英文月名 日 年 时:分:秒 时区",如Tue May 25 2015 00:00:00 GMT-0700。

ISO 8601扩展格式 YYYY-MM-DDTHH:mm:ss.sssZ(例如2015-11-25T00:00:00)。只有兼容ECMAScript5的实现支持这种格式。

例如,要为2015年5月25日创建一个日期对象:
var someDate=new Date(Date.parse("May 25,2015"));
如果传入Date.parse()方法的字符串不能表示日期,那么它会返回NaN。实际上,如果直接将表示日期的字符串传给Date构造函数,后台也会调用Date.parse()。例如,var someDate=new Date("May 25,2015");
Date.UTC ()方法也返回表示日期的毫秒数,但与Date.parse()在构建值时使用不同的信息。Date.UTC()的参数分别是年份、基于0的月份(一月是0,二月是1,……)、月中的哪一天(1到31)、小时数(0到23)、分钟、秒以及毫秒数,这些参数中只有前两个参数是必须的,天数默认为1,其他为0。
//GMT时间2000年1月1日午夜零时
var someDate=new Date(Date.UTC(2000,0));
//GMT时间2005年5月5日下午5:55:55
var someDate=new Date(Date.UTC(2005,4,5,17,55,55));

ECMAScript5添加了Date.now()方法,简化了使用Date对象分析代码的工作。
4.RegExp类型
ECMAScript通过RegExp类型来支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式:
var expression = /pattern/flags ;
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志:

g:表示全局模式(global),即模式被应用于所有字符串,而非在发现第一个匹配项时立即停止;

i:表示不区分大小写模式(case-insensitive);

m:表示多行模式(multiline),即在到达一行文本末尾时还会继续查找下一行是否存在与模式匹配的项。

因此,一个正则表达式就是一个模式与上述3个标志的组合体。如下例所示:
/*
* 匹配字符串中所有"at"的实例
*/
var pattern1 = /at/g ;

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

/*
* 匹配所有以"at"结尾的3个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi ;

与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:
    ( [ { \ ^ $ | ) ? * + . ] }

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

/*
* 匹配第一个"[bc]at",不区分大小写
*/
var pattern2 = /\[bc\]at/i ;

/*
* 匹配所有以"at"结尾的3个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi ;

/*
* 匹配所有".at",不区分大小写
*/
var pattern4 = /\.at/gi ;

前面举的例子都是以字面量形式来定义正则表达式,另一种创建正则表达式的方式是使用RegExp构造函数,接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i ;

/*
* 与pattern1相同
*/
var pattern2 = new RegExp("[bc]at","i");

4.1 RegExp实例属性
RegExp的每个实例都具有下列属性:

global:布尔值,表示是否设置了g标志

ignoreCase:布尔值,表示是否设置了i标志

lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起

multiline:布尔值,表示是否设置了m标志

source:正则表达式的字符串表示,按照字面量形式返回

4.2 RegExp实例方法
RegExp对象的主要方法是exec(),该方法是专门为捕获组而设计的。exec()接收一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组或者null。返回的数组虽然是Array的实例,但包含额外两个属性:index和input。其中,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。
var text="mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi ;

var matches=pattern.exec(text);
alert(matches.index); //0
alert(matches.input); //"mom and dad and baby"
alert(matches[0]); //"mom and dad and baby"
alert(matches[1]); //" and dad and baby"
alert(matches[2]); //" and baby"
对于exec而言,即使在模式中设置了全局标志(g),它每次也只返回一个匹配项。

正则表达式的第二个方法是test(),它接受一个字符串参数。
var text="000-00-0000";
var pattern=/\d{3}-\d{2}-\d{4}/;

if(pattern.test(text)){
alert("匹配成功!");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: