js高级第三版(第五章 引用类型)二

5.3 Date 类型

     ECMAScript 中的 Date 类型是在早期 Java 中的 java.util.Date 类基础上构建的。为此,Date类型使用自 UTC(Coordinated Universal Time,国际协调时间)1970 年 1 月 1 日午夜(零时)开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date 类型保存的日期能够精确到 1970 年 1月 1 日之前或之后的 285 616 年。

    要创建一个日期对象,使用 new 操作符和 Date 构造函数即可,如下所示。    

    var now = new Date();

    Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。

    如果传入 Date.parse()方法的字符串不能表示日期,那么它会返回 NaN。

    Date.UTC()方法同样也返回表示日期的毫秒数,但它与 Date.parse()在构建值时使用不同的信息。

    Date.UTC()的参数分别是:

    年份、基于 0 的月份(一月是 0,二月是 1,以此类推)、

    月中的哪一天(1 到 31)、

    小时数(0 到 23)、分钟、秒以及毫秒数。

    在这些参数中,只有前两个参数(年和月)是必需的。如果没有提供月中的天数,则假设天数为 1;如果省略其他参数,则统统假设为 0。

    5.3.1 继承的方法

    Date 类型的

    toLocaleString()方法会按照与浏览器设置的地区相适应的格式返回日期和时间。

    toString()方法则通常返回带有时区信息的日期和时间,其中时间一般以军用时间(即小时的范围是 0 到 23)表示。

    valueOf()方法,则根本不返回字符串,而是返回日期的毫秒表示。

    5.3.2 日期格式化方法

    Date 类型还有一些专门用于将日期格式化为字符串的方法,这些方法如下。

     toDateString()——以特定于实现的格式显示星期几、月、日和年;

     toTimeString()——以特定于实现的格式显示时、分、秒和时区;

     toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年;

     toLocaleTimeString()——以特定于实现的格式显示时、分、秒;

     toUTCString()——以特定于实现的格式完整的 UTC 日期。

    与 toLocaleString()和 toString()方法一样,以上这些字符串格式方法的输出也是因浏览器而异的,因此没有哪一个方法能够用来在用户界面中显示一致的日期信息。

    5.3.3 日期/时间组件方法

    getTime() 返回表示日期的毫秒数;与valueOf()方法返回的值相同

    setTime(毫秒) 以毫秒数设置日期,会改变整个日期

    getFullYear() 取得4位数的年份(如2007而非仅07)

    getUTCFullYear() 返回UTC日期的4位数年份

    setFullYear(年) 设置日期的年份。传入的年份值必须是4位数字(如2007而非仅07)

    setUTCFullYear(年) 设置UTC日期的年份。传入的年份值必须是4位数字(如2007而非仅07)

    getMonth() 返回日期中的月份,其中0表示一月,11表示十二月

    getUTCMonth() 返回UTC日期中的月份,其中0表示一月,11表示十二月

    setMonth(月) 设置日期的月份。传入的月份值必须大于0,超过11则增加年份

    setUTCMonth(月) 设置UTC日期的月份。传入的月份值必须大于0,超过11则增加年份

    getDate() 返回日期月份中的天数(1到31)

    getUTCDate() 返回UTC日期月份中的天数(1到31)

    setDate(日) 设置日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份

    setUTCDate(日) 设置UTC日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份

    getDay() 返回日期中星期的星期几(其中0表示星期日,6表示星期六)

    getUTCDay() 返回UTC日期中星期的星期几(其中0表示星期日,6表示星期六)

    getHours() 返回日期中的小时数(0到23)

    getUTCHours() 返回UTC日期中的小时数(0到23)

    setHours(时) 设置日期中的小时数。传入的值超过了23则增加月份中的天数

    setUTCHours(时) 设置UTC日期中的小时数。传入的值超过了23则增加月份中的天数

    getMinutes() 返回日期中的分钟数(0到59)

    getUTCMinutes() 返回UTC日期中的分钟数(0到59)

    setMinutes(分) 设置日期中的分钟数。传入的值超过59则增加小时数

    setUTCMinutes(分) 设置UTC日期中的分钟数。传入的值超过59则增加小时数

    getSeconds() 返回日期中的秒数(0到59)

    getUTCSeconds() 返回UTC日期中的秒数(0到59)

    setSeconds(秒) 设置日期中的秒数。传入的值超过了59会增加分钟数

    setUTCSeconds(秒) 设置UTC日期中的秒数。传入的值超过了59会增加分钟数

    getMilliseconds() 返回日期中的毫秒数

    getUTCMilliseconds() 返回UTC日期中的毫秒数

    setMilliseconds(毫秒) 设置日期中的毫秒数

    setUTCMilliseconds(毫秒) 设置UTC日期中的毫秒数

    getTimezoneOffset() 返回本地时间与UTC时间相差的分钟数。

    5.4 RegExp 类型

    ECMAScript 通过 RegExp 类型来支持正则表达式。

        var expression = / pattern / flags ;

    其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,

    可以包含字符类、限定符、分组、向前查找以及反向引用。

    每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。

    正则表达式的匹配模式支持下列 3 个标志。

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

     i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;

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

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

    使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式不一样。

    ECMAScript 5 明确规定,使用正则表达式字面量必须像直接调用 RegExp 构造函数一样,每次都创建新的 RegExp 实例。

    5.4.1 RegExp实例属性

    RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。

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

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

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

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

     source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

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

    注:字面量和构造函数的source 属性是相同的。source 属性保存的是规范形式的字符串,即字面量形式所用的字符串。

    5.4.2 RegExp实例方法

    exec()接受一个参数,

        即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。

        返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。

        其中,index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串。

    IE 的 JavaScript 实现在 lastIndex 属性上存在偏差,即使在非全局模式下,lastIndex 属性每次也会变化。

    test()接受一个字符串参数。

        在模式与该参数匹配的情况下返回true;否则,返回 false。

        在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便。

        因此,test()方法经常被用在 if 语句中,

    RegExp 实例继承的 toLocaleString()和 toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。

    正则表达式的 valueOf()方法返回正则表达式本身。

    5.4.3 RegExp构造函数属性

    RegExp 构造函数包含一些属性(这些属性在其他语言中被看成是静态属性)。

   属性分别有一个长属性名和一个短属性名(Opera 是例外,它不支持短属性名)。

    下表列出了 RegExp 构造函数的属性。

     input $_ 最近一次要匹配的字符串。Opera未实现此属性

    lastMatch $& 最近一次的匹配项。Opera未实现此属性

    lastParen $+ 最近一次匹配的捕获组。Opera未实现此属性

    leftContext $` input字符串中lastMatch之前的文本

    multiline $* 布尔值,表示是否所有表达式都使用多行模式。IE和Opera未实现此属性

    rightContext $' Input字符串中lastMatch之后的文本

    RegExp 构造函数的各个属性返回了下列值:

     input 属性返回了原始字符串;

     leftContext 属性返回了单词 short 之前的字符串,而 rightContext 属性则返回了 short之后的字符串;

     lastMatch 属性返回最近一次与整个正则表达式匹配的字符串,即 short;

     lastParen 属性返回最近一次匹配的捕获组,即例子中的 s。

    5.4.4 模式的局限性

    尽管 ECMAScript 中的正则表达式功能还是比较完备的,但仍然缺少某些语言(特别是 Perl)所支持的高级正则表达式特性。

    以下为不支持情况:

     匹配字符串开始和结尾的\A 和\Z 锚,但支持以插入符号(^)和美元符号($)来匹配字符串的开始和结尾。

     向后查找(lookbehind),但完全支持向前查找(lookahead)。

     并集和交集类 原子组(atomic grouping)

     Unicode 支持(单个字符除外,如\uFFFF)

     命名的捕获组,但支持编号的捕获组。

     s(single,单行)和 x(free-spacing,无间隔)匹配模式

     条件匹配

     正则表达式注释

    5.5 Function 类型

        函数实际上是对象

        每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。

        函数定义:

        function 函数名(参数){代码行}

    5.5.1 没有重载(深入理解)

        将函数名想象为指针,也有助于理解为什么 ECMAScript 中没有函数重载的概念。

        在创建第二个函数时,实际上覆盖了引用第一个函数的变量

    5.5.2 函数声明与函数表达式

        对函数声明和函数表达式的区别

        解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);

        至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

        除了访问时间有区别,函数声明与函数表达式的语法其实是等价的。

    5.5.3 作为值的函数

        因为 ECMAScript 中的函数名本身就是变量,所以函数也可以作为值来使用。

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

    5.5.4 函数内部属性

        在函数内部,有两个特殊的对象:arguments 和 this。

        arguments 是一个类数组对象,包含着传入函数中的所有参数。

        arguments 的主要用途是保存函数参数,

        但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。

        this引用的是函数据以执行的环境对象

        ECMAScript 5 也规范化了另一个函数对象的属性:caller。

        这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为 null。

    5.5.5 函数属性和方法

    ECMAScript 中的函数是对象,因此函数也有属性和方法。

    每个函数都包含两个属性:length 和 prototype。

    length 属性表示函数希望接收的命名参数的个数。

    prototype 是保存它们所有实例方法的真正所在。

    每个函数都包含两个非继承而来的方法:apply()和 call()。

    两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。

    apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。

    其中,第二个参数可以是 Array 的实例,也可以是arguments 对象。

    call()方法:

    第一个参数是 this 值没有变化,变化的是其余参数都直接传递给函数。

    换句话说,在使用call()方法时,传递给函数的参数必须逐个列举出来。

猜你喜欢

转载自blog.csdn.net/lugr_shx/article/details/80755069