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

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("匹配成功!");

}

时间: 2024-10-28 20:16:52

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

javascript高级编程学习笔记(二)

写读书笔记的好处在于加深记忆,前一篇总结了编程中创建的对象的几种方式,以及常用的方式,这一篇总结实现继承的方式: 1.对象冒充: function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.color); }; } function ClassB(sColor, sName) { this.newMethod = ClassA; this.newMethod(sColor); de

JavaScript高级程序设计学习笔记--引用类型

Object类型 对象字面量表示法: var person={ name:"Nicholas", age:29, 5:true }; 这人例子会创建一个对象,包含三个属性:name,age和5.但这里的数值属性名会自动转换为字符串. 对象属性的访问:点表示法和方括号语法 alert(person["name"]); // "Nicholas" alert(person.name); // "Nicholas" 从功能上看,这两

《javascript高级程序设计》笔记(二十四)

最佳实践 (一)可维护性 1.什么是可维护的代码 可理解性   直观性    可适应性    可调适性 2.代码约定 ①可读性 ?缩进 ?注释    每个函数和方法——都应该包含一个注释,描述其目的和用到的算法.陈述事先的假设如参数代表什么,函数是否有返回值. 大段代码——前面应该放一个描述任务的注释 复杂的算法——解析是如何做的 Hack ②变量和函数的命名 ?变量名应该为名词 ?函数名应该以动词开始,如getName(),返回布尔值的函数一般以is开头,如isEnable(). ?变量和函数

JavaScript高级编程(学习笔记)

一 内存分配 1,栈:由计算机管理,先进后出,快但不自由  堆:由程序员控制,自由 2,引用类型存于堆,值类型存于声明它的地方 二 垃圾回收 1,找出不再使用的变量(堆内存中,没有栈内存指向它),然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行. 2,离开作用域标记可删,大部分浏览器都是使用这种方式进行垃圾回收,区别在于如何标记及垃圾回收间隔而已 3,JavaScript对象通过标记清除的方式进行垃圾回收,但非JavaScript原

《javascript高级程序设计》笔记(二十)

JSON JSON是javascript的一个严格的子集,利用了javascript中的一些模式来表示结构化数据.JSON是在javascript中读写结构化数据的更好的方式.因为可以把JSON传给eval(),不用创建DOM对象. (一)语法 简单值: 字符串.数值.数组和null,不支持undefined. 对象   :一组无序的键值对,可以是简单值,也可以是复杂数据类型的值. 数组   :一组有序的值的列表,可以通过数值索引来访问其中的值,数组的值可以是任意类型. 1.简单值 字符串必须使

javascript高级程序设计读书笔记2

<!DOCTYPE HTML>//这个网页的文档类型,这个是html5的写法Bootstrap使用的某些HTML元素和CSS属性需要文档类型为HTML5 doctype.因此这一文档类型必须出现在项目的每个页面的开始部分 <html lang="en">//这里的lang="en"可以删除,如果不删除的,用谷歌之类打开,它会认为是英文的,会自动给翻译(如果设置了自动翻译的话) 有两个版本的 jQuery 可供下载:Production ver

JavaScript高级程序设计---学习笔记(二)

面向对象程序设计 1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直接访问它们.ECMAScript中有两种属性:数据属性和访问器属性. 1)数据属性数据属性包含一个数据值的位置,在这个位置可以读取和写入值.数据属性有4个描述其行为的特征.1.[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改

《javascript高级程序设计》笔记(二十二)

高级技巧 (一)高级函数 1.安全的类型检测 javascript内置的类型检测机制并非完全可靠,如typeof操作符.instanceof操作符在存在多个全局作用域(一个页面包含多个iframe)时会有问题. //value要是一个数组,且与Array构造函数在同一个全局作用域 //如果value是另个iframe的数组,则返回false var isArray = value isinstanceof Array; 原生数组的构造函数名与全局作用域无关,使用toString()能保持返回一致

javascript高级程序设计 读书笔记2

第五章 引用类型 对象是引用类型的实例,引用类型是一种数据结构,将数据和功能组织在一起.描述的是一类对象所具有的属性和方法.对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数俩创建的,构造函数本身就是一个函数,只不过该函数试处于创建新对象的目的而定义的.  eg:    var person = new Object(); 1.创建Object实例的方式有两种   一:new+Object 二:对象字面量 var person = new Object(); var pers