引用类型(二)

来源:互联网 发布:js 3d图片墙特效代码 编辑:程序博客网 时间:2024/06/16 07:16

(三)Date类型

提供了有关日期和时间的信息,包括当前日期和时间以及相关的计算功能。可以精确到毫秒数(1/1000秒)。

1、日期对象的创建

var now = new Date();  //使用new操作符和Date构造函数var d = new Date(milliseconds); //返回从1970年1月1日至今的毫秒数var d = new Date(dateString);var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);

在调用Date构造函数而不传递参数时,新创建的对象自动获取当前日期和时间。

2、方法

1)返回日期毫秒数的方法

  • Date.parse()方法:接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。如果传入的字符串不能表示日期,那么它会返回NaN。
  • Date.UTC()方法:返回表示日期的毫秒数。参数分别是年份、基于0的月份、月中的哪一天、小时数、分钟、秒以及毫秒数。其中,只有前两个参数是必需的。
  • Date.now()方法(ECMAScript 5 添加):返回调用这个方法时的日期和时间的毫秒数。

2)继承的方法

  • valueOf():不返回字符串,返回日期的毫秒表示。
  • toLocaleString():按照与浏览器设置的地区相适应的格式返回日期和时间。
  • toString():返回带有时区信息的日期和时间,其中时间一般以军用时间表示。

3)日期格式化方法:将日期格式化为字符串。

  • toDateString():以特定于实现的格式显示星期几、月、日和年。
  • toTimeString():以特定于实现的格式显示时、分、秒和时区。
  • toLocaleDateString():以特定于地区的格式显示星期几、月、日和年。
  • toLocaleTimeString():以特定于实现的格式显示时、分、秒。
  • toUTCString():以特定于实现的格式完整的UTC日期。

4)日期/时间组件方法:直接取得和设置日期中特定部分的方法。

  • get/setTime():返回/设置日期的毫秒数,即从1970年1月1日零时到日期对象所指的日期的毫秒数。
  • get/setFullYear():取得4位数的年份/设置日期中的年份。
  • get/setMonth():返回/设置日期中的月份。
  • get/setDate():返回/设置日期月份中的天数。
  • getDay():返回日期中星期的星期几,其中0表示星期天。
  • get/setHours():返回/设置日期中的小时数(0到23)。
  • get/setMinutes():返回/设置日期中的分钟数(0到59)。
  • get/setSeconds():返回/设置日期中的秒数。

(四)RegExp类型

是ECMAScript支持正则表达式的一个接口,提供了最基本的和一些高级的正则表达式功能。

1、正则表达式的创建

1)以字面量形式来定义

var expression = /pattern/flags;
  • 模式(pattern)部分:简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。
  • 标志(flags)
    • g:全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。
    • i:不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写。
    • m:多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。

【注】正则表达式中的元字符包括:( [ { \ ^ $ | ) ? + . ] }*
想要匹配字符串中包含的这些字符,需要对它们进行转义。

2)使用RegExp构造函数

接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。

//匹配第一个"bat"或"cat"不区分大小写var pattern1 = /[bc]at/i;var pattern2 = new RegExp("[bc]at", "i");  //与pattern1相同

在ECMAScript 3中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。
ECMAScript 5明确规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例。

2、RegExp实例属性

通过这些属性可以获知一个表达式的各方面信息,但没多大用处,因为这些信息全都包含在模式声明中。

  • global:布尔值,表示是否设置了g标志。
  • ignoreCase:布尔值,表示是否设置了i标志。
  • lastIndex:整数,表示开始搜素下一个匹配项的字符位置,从0算起。
  • multiline:布尔值,表示是否设置了m标志。
  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

3、RegExp实例方法

1)exec():专门为捕获组而设计。

  • 接收一个参数,即要应用模式的字符串。
  • 返回包含第一个匹配项信息的数组;如果没有匹配项,返回null。
    • 返回的数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。如果模式中没有捕获组,则该数组只包含一项。
    • 返回的数组还包含两个额外的属性:index和input。
      • index表示匹配项在字符串中的位置。
      • input表示应用正则表达式的字符串。
  • 在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息;在设置全局标志的情况下,每次调用exec()都会在字符串中继续查找新匹配项。

2)test()

  • 接收一个字符串参数。
  • 在模式与该参数匹配的情况下返回true,否则返回false。

3)继承的方法

toLocaleString()和toString():返回正则表达式的字面量,与创建正则表达式的方式无关。

3、RegExp构造函数属性

长属性名 短属性名 说明 input $_ 最近一次要匹配的字符串。Opera未实现此属性。 lastMatch $& 最近一次的匹配项。Opera未实现此属性。 lastParen $+ 最近一次匹配的捕获组。Opera未实现此属性。 leftContext $` input字符串中lastMatch之前的文本。 multiline $* 布尔值,表示是否所有表达式都使用多行模式。IE和Opera未实现此属性。 rightContext $’ Input字符串中lastMatch之后的文本。

4、模式的局限性(不支持的特性)

  • 匹配字符串开始和结尾的\A和\Z锚
  • 向后查找
  • 并集和交集类
  • 原子组
  • Unicode支持(单个字符除外)
  • 命名的捕获组
  • 单行和无间隔匹配模式
  • 条件匹配
  • 正则表达式注释

(五)Function类型

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。
函数实际上是对象,函数名实际上也是一个指向函数对象的指针。

1、函数的定义

  • 使用函数声明语法定义。
  • 使用函数表达式定义,此时没有必要使用函数名,实际上是一个匿名函数。
  • 使用Function构造函数。可以接收任意数量的参数,前面的参数枚举了新函数的参数,最后一个参数始终都被看成是函数体。此方法不推荐。
//使用函数声明语法定义function sum(num1, num2){    return num1 + num2;}//使用函数表达式定义var sum = function(num1, num2){    return num1 + num2;}//使用Function构造函数var sum = new Function("num1", "num2", "return num1 + num2");  //不推荐

2、没有重载

3、函数声明与函数表达式

解析器在向执行环境中加载数据时,会先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

alert(sum1(10,10));  //可以正常运行function sum1(num1, num2){    return num1 + num2;}alert(sum2(10,10));  //导致“unexpected” identifier”(意外标识符)错误var sum2 = function(num1, num2){    return num1 + num2;}

第一段代码可以正常运行的原因是,在代码开始执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。
而第二段代码在运行期间会产生错误,这是因为在执行到函数所在的语句之前,变量sum2不会保存有对函数的引用,而且在定义前就发生了错误,所以也不会向下继续执行。

【注】提升(Hoisting)是JavaScript默认将当前作用域提升到前面去的行为。提升应用在变量或函数的声明。

4、作为值的函数

不仅可以像传递参数一样把一个函数传递给另一个函数,还可以将一个函数作为另一个函数的结果返回。

看下面这个例子。

function callSomeFunction(someFunction, someArgument){    return someFunction(someArgument);}function add10(num){    return num + 10;}var result = callSomeFunction(add10,10);alert(result);  //20

上面的callSomeFunction()函数接收两个参数。第一个参数是一个函数,在这里是add10()函数,第二个参数是要传递给该函数的一个值,也就是10。最后执行的结果其实就是传入的值在传入的函数中返回的结果。

5、函数内部属性(两个特殊对象)

1)arguments

  • 类数组对象,包含传入函数中的所有参数。
  • 还有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。
function factorial(num){    if (num <= 1){        return 1;    }    else {        return num * factorial(num-1);    }}

上面函数的执行与函数名factorial紧紧耦合在了一起。为了消除这种紧密耦合的现象,可以使用arguments.callee。这样的话,无论引用函数时使用的是什么名字,都可以保证正常的调用。如下代码所示。

function factorial(num){    if (num <= 1){        return 1;    }    else {        return num * arguments.callee(num-1);    }}

2)this:引用的是函数执行的环境对象,也就是说,this指向函数执行时的当前对象。

  • 当函数没有被自身的对象调用时,this的值就会变成全局对象。(在Web浏览器中,this的值是window对象)
  • 构造函数中this关键字没有任何的值。this的值在函数调用时实例化对象时创建。
  • this是保留关键字,不能修改this的值。
  • 在严格模式下,在调用函数时第一个参数会成为this的值,即使该参数不是一个对象。
  • 在非严格模式下,如果第一个参数的值是null或undefined,它将使用全局对象替代。

3)caller(ECMAScript 5 规范化)

  • 保存调用当前函数的函数的引用。
  • 如果在全局作用域中调用当前函数,它的值为null。
  • 在非严格模式下,arguments.caller属性(ECMAScript 5 定义)始终是undefined。
  • 在严格模式下,访问arguments.callee会导致错误,以及不能为函数的caller属性赋值。

6、函数的属性和方法

1)属性

  • length:表示函数希望接收的命名参数的个数。
  • prototype:是保存引用类型所有实例方法的真正所在。在ECMAScript 5 中,不可枚举,使用for-in无法发现。

2)非继承的方法

  • apply():接收两个参数,一个是在其中运行函数的作用域(this),另一个是参数数组。
  • call():接收两个参数,第一个是this值,第二个是直接传给函数的参数。
  • bind()(ECMAScript5定义):创建一个函数实例,其this值会被绑定到传给bind()函数的值。

【注】apply()和call()这两个方法的用途是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。它们的区别仅在于接收参数的方式不同。除此之外,它们还能够扩充函数赖以运行的作用域。

阅读全文
0 0
原创粉丝点击