JavaScript 中的引用类型Date 和RegExp的详细介绍

目录
  • 引用类型 & 引用值的理解
  • Date 引用类型
    • Date.parse()方法
    • Date.UTC()方法
    • 继承的方法
  • RegExp
    • RegExp 实例方法
      • exec()
      • test()
    • 继承的方法

引用类型 & 引用值的理解

引用值(或者对象)是某个特定引用类型实例。 在ECMAScript中,引用类型是把数据和功能组织到一起的结构,经常被人错误的称作“类”。虽然从技术上讲JavaScript 是一门面向对象语言,但ECMAScrtipt 缺少传统的面相对象语言所具备的某些基本结构,包括类和接口。引用类型有时候也被称为对象定义,因为它们描述了自己的对象应有的属性和方法。
对象被认为是某个特定引用类型的实例。新对象通过使用new 操作符后跟一个构造函数来创建。构造函数就是用来创建新对象的函数。

let now = new Date();

这行代码代码创建了引用对象Date 的一个新实例,并将它保存在变量now 中。Date()在这里就是构造函数,它负责创建一个只有默认属性和方法的简单对象。ECMAScript 提供了很多像Date这样的原生引用类型,帮助开发者实现常见的任务。函数也是一种引用类型。

Date 引用类型

ECMAScript 的Date 类型参考了Java 早期版本中的java.until.Date.为此,Date类型将日期保存为自协调世界时(UTC)时间1970年1月1日午夜(零时)至今所经过的毫秒数。使用这种存储方式,Date类型可以精确的标识1970年1月1日之前及之后285616年的日期。
要创建日期对象,就是用new 操作符来调用Date构造函数:

let now = new Date();
console.log(now);//   Mon Jul 18 2022 15:36:02 GMT+0800 (中国标准时间)

在不给Date 构造函数传递参数的情况下,创建的对象,保存的是当前的日期和时间。要基于其他日期和时间创建日期对象,必须穿入其毫秒标识。ECMAScript 为此提供了两个辅助方法:Date.parse()和Date.UTC();

Date.parse()方法

Date.parse()方法接收一个表示日期和的字符串函数,尝试将这个字符串转换为表示该日期的毫秒数。 ECMA-262 第5版 定义了Date.parse()应该支持的日期格式。所有实现必须支持一下列日期格式:

  • “月/日/年”,如“5/23/2022”
  • “月名 日,年”,如“May 23,2022”;
  • “周几,月名 日 年 时:分:秒”,如”Tue May 23 2019 00:00:00 GMT-0700“。

如果传给Date.parse()的字符串并不表示日期,则该方法返回NaN。如果直接把表示日期的字符串传给Date的构造函数,那么Date 会在后台调用Date.parse()。换句话说,如下两行代码代表的意思一致。

let someDate = new Date(Date.parse("May 23,2022"));
let someDateTwo = new Date("May 23,2022");

Date.UTC()方法

Date.UTC()方法也返回日期的毫秒标识,但使用的是跟Date.parse()不同的信息来生成这个值。传给Date.UTC()的参数时年,零起点月数(1月是0,2月是1,依次类推),日(1-31),时(0-23),分,秒和毫秒。这些参数中,只有(年和月)是必须的。如果不提供日,那么默认为1日。其他的默认值都是0.

let y2k = new Date(Date.UTC(2000,0)); //GMT 时间2000年1月1日零点。
let allLives = new Date(Date.UTC(2005,3,5,17,55,55));// 2005年5月5日下午5点55分55秒

与Date.parse()一样,Date.UTC也会被Date的构造函数隐式调用,但有一个区别,这种情况下创建的时本地日期,不是GMT日期。 也就是说,隐式调用情况下下,我们传递给Date.UTC()方法的返回的毫秒数是本地时间距离1970年1月1日的毫秒数,我们传递的这个日期,在JavaScript看来是UTC时间,它默认已经加上了时区插值的毫秒数。但是显示的调用UTC()方法时,传递的日期就是GMT时间。GMT 时间与UTC 时间的关系为:GMT = UTC + 0.

  let utc = new Date(2022, 6, 18, 17, 15);//
  console.log(utc.toString());//Mon Jul 18 2022 17:15:00 GMT+0800 (中国标准时间)
  console.log(new Date(Date.UTC(2022, 6, 18, 17, 15)));//Tue Jul 19 2022 01:15:00 GMT+0800 (中国标准时间)

Date.parse()方法 与Date.UTC()方法 的使用注意 首先parse方法和UTC 方法都可以隐式调用。所以我们可以这么理解,有两种方式可以创建日期。给Date构造函数传入的是一个日期字符串时,会默认调用parse方法,传入以整数的形式表示的日期会调用UTC方法。但是默认情况下我们传递的日期是加上了时区的毫秒数的,这个一定要清楚。 如果要使用UTC方法的传递GMT时间,一定要显示的调用UTC()方法。
当要明确的求取某个时区的某个时间的毫秒时,需要使用parse()方法。

继承的方法

Date 继承自Object 方法,因此也会有toLocaleString,toString()和valueOf方法。

Date 类型重写了这三个方法的实现:

  • Date类型的toLocaleString()方法返回与浏览器运行的本地环境一致的时间和日期。这通常意味着格式中包含针对时间的AM(上午)或PM(下午),但不包含时区信息。
  • toString()返回带时区信息的日期和时间,时间也是以24小时制表示的。
  • Date类型的valueOf方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示。

下面是toLocaleString,toString()和valueOf的测试打印数据,可供参考。

Date(2022, 6, 14, 10, 50)
 toString: Thu Jul 14 2022 10:50:00 GMT+0800 (中国标准时间)
 toLocaleString: 2022/7/14 10:50:00
 valueOf: 1657767000000

****************************
 Date.UTC(2022, 6, 14, 10, 50)
 toString: Thu Jul 14 2022 18:50:00 GMT+0800 (中国标准时间)
 toLocaleString: 2022/7/14 18:50:00
 valueOf: 1657795800000

****************************
Date.parse("Thur 07 14 2022 10:50:00 GMT+0800")
toString: Thu Jul 14 2022 10:50:00 GMT+0800 (中国标准时间)
toLocaleString: 2022/7/14 10:50:00
valueOf: 1657767000000
****************************
Date("Thur 07 14 2022 10:50:00 GMT+0800")
toString: Thu Jul 14 2022 10:50:00 GMT+0800 (中国标准时间)
toLocaleString: 2022/7/14 10:50:00
valueOf: 1657767000000
 ****************************
Date.now()
toString: 1657767000086
toLocaleString: 1,657,767,000,086
valueOf: 1657767000086

RegExp

ECMAScript 通过RegExp 类型支持正则表达式。正则表达式使用类似Perl 的简介语法来创建。

let expersiion = /pattern/flags

这个正则表达式的pattern(模式)可以时任何简单或复杂的正则表达式,包括字符类,限定符,分组,向前查找和反向引用。每个正则表达式可以带零个或多个flags(标记),用于控制正则表达式的行为。

下面给出了匹配模式的标记:

  • g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
  • i:不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写。
  • m:多行模式,表示查找到一行末尾时会继续查找
  • y:粘贴模式,表示只查找从lastIndex开始及之后的字符串。
  • u:Unicode模式,启用Unicode匹配。
  • s:doAll模式,表示元字符,匹配任何字符(包括\n或\r).

使用不同模式和标记可以创建出各种正则表达式,比如:

//匹配字符串中的所有“at”
let pattern = /at/g;

//匹配第一个“bat”或“cat”,忽略大小写
let pattern2 = /[bc]at/i;

//匹配所有以“at”结尾的三字符组合,忽略大小写。
let pattern3 = /.at/gi

与其他语言的正则表达式类似,所有元字符在模式中也必须转义,包括: ( [ \ ^ $ |)] ? * + .
元字符在正则表达式中都有一种或多种特殊功能,所有要匹配上面这些字符本身,就必须使用反斜杠来转义

//匹配第一个“bat”或“cat”,忽略大小写
let pattern2 = /[bc]at/i;

//匹配第一个“[bc]at”,忽略大小写
let pattern2 = /\[bc\]at/i;

//匹配所有以“at”结尾的三字符组合,忽略大小写。
let pattern3 = /.at/gi

//匹配所有".at",忽略大小写。
let pattern3 = /\.at/gi

前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用RegExp 构造函数来创建,它接收两个参数:模式字符串和(可选的)标记字符串。任何使用字面量定义的正则表达式也可以通过构造函数来创建:

//匹配第一个“bat”或“cat”,忽略大小写
let pattern1 = /[bc]at/i;

//跟pattern1一样,只不过是用构造函数创建的。
let pattern2 = new RegExp("[bc]at","i");

这里的pattern1 和pattern2 是等效的正则表达式。注意,RegExp构造函数的两个参数都是好字符串。因为RegExp的模式参数是字符串,所以某些情况下需要二次转义。所有元字符都必须二次转义,包括转义字符,如\n(\转义后的字符串是\,在正则表达式中则要写成\\).

字面量模式 对应的字符串
/[bc]at/ "\[bc]\]at"
/.at/ "\at."
/name/age/ "name\/age"
/\d/\d{1,2} "\d.\d{1,2}"
/\w\hello\123 "\w\\hello\\123"

RegExp 实例方法

exec()

RegExp的主要方法是exec(),主要用于配合捕获组使用。这个方法只接受一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没有找到匹配项,则返回null。返回的数组虽然是Array的实例,。但包含两个额外的属性:index和input。index是字符串中匹配模式的起始位置,input 是要查找的字符串。这个数据的第一个元素是匹配整个模式的字符串,其他元素食欲表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素。

let text = "mom and dad and baby";
let pattern = /mom( and dad( and baby)?)?/gi

let matches = pattern.exec(text);
console.log(matches.index); //0
console.log(matches.input); //"mom and dad and baby"
console.log(matches[0]);// "mom and dad and baby"
console.log(matches[1]);// " and dad and baby"
console.log(matches[2]);// " and baby"

在这个例子中,模式包含两个捕获组:最内部的匹配项“ and baby”,以及外部的匹配项“ and dad” 或“ and dad and baby”。调用exec()后找到了一个匹配项。因为整个字符串匹配模式,所以matches数组的index 属性就是0。数组的第一个元素是匹配的整个字符串,第二个元素是匹配第一个捕获组的字符串,第三个元素是匹配第二个捕获组的字符串。 如果模式设置了全局标记,则每次调用exec()方法会返回一个匹配的信息。如果没有设置全局标记,则无论对同一个字符串调用多少次exec(),也只会返回第一个匹配的信息。

let text = "cat, bat, sat, fat";
let pattern = /.at/;
let matches = pattern.exec(text);
console.log(matches.index);//0
console.log(matches[0]);//cat
console.log(pattern.lastIndex);//0

matches = pattern.exec(text);
console.log(matches.index);//0
console.log(matches[0]);//cat
console.log(pattern.lastIndex);//0

上面的例子没有设置全局标记,因此调用exec()只返回第一个匹配项("cat").lastIndex 在非全局模式下始终不变。
如果在这个模式上设置了g标记,则每次调用exec()都会在字符串向前搜索下一个匹配项。

let text = "cat, bat, sat, fat";
let pattern = /.at/g;

let matches = pattern.exec(text);
console.log(matches.index);//0
console.log(matches[0]);//cat
console.log(pattern.lastIndex);//3

matches = pattern.exec(text);
console.log(matches.index);//5
console.log(matches[0]);//bat
console.log(pattern.lastIndex);//8
matches = pattern.exec(text);
console.log(matches.index);//10
console.log(matches[0]);//sat
console.log(pattern.lastIndex);//13

如果设置了粘附标记y,则每次调用exec()就只会在lastIndex的位置上寻找匹配项。

粘附标记会覆盖全局标记:

let text = "cat, bat, sat, fat";
let pattern = /.at/y;
let matches = pattern.exec(text);
console.log(matches.index);//0
console.log(matches[0]);//cat
console.log(pattern.lastIndex);//3

//以索引3对应的字符开头找不到匹配项,因此exec() 返回null
//
matches = pattern.exec(text);
console.log(matches);//null
console.log(pattern.lastIndex);//0

//向前设置lastIndex 可以让粘附的模式通过exec()找到下一个匹配项。
pattern.lastIndex = 5;
matches = pattern.exec(text);
console.log(matches.index);//5
console.log(matches[0]);//bat
console.log(pattern.lastIndex);//8

test()

正则表达式的另一个方法是test(),接收一个字符串参数。如果输入的文本与模式匹配,则参数返回true,否则返回false。这个方法适用于只想测试模式是否匹配,而不需要世界匹配内容的情况。

let  text = "000-00-0000";
let pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(test)){
    console.log("The pattern was matched.");
}

继承的方法

无论正则表达式怎么创建的,继承的方法toLocalString()toString()都返回正则表达式的字面量表示。

   let pattern = new RegExp("\\[bc]\\at]at","gi");
   console.log(pattern.toString()); ///\[bc\]at/gi
   console.log(pattern.toLocaleString()); // /\[bc\]at/gi
   console.log(pattern.valueOf());///\[bc]\at]at/gi

到此这篇关于JavaScript 中的引用类型Date 和RegExp的详细介绍的文章就介绍到这了,更多相关JS引用类型Date和 RegExp内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript引用类型RegExp基本用法详解

    本文实例讲述了JavaScript引用类型RegExp基本用法.分享给大家供大家参考,具体如下: 1.正则表达式定义 三个标志:全局模式g,不区分大小写模式i,多行模式m. 1) 字面量定义 var pattern = /[fe]at/gim; 2) 构造函数定义: 接收两个参数--要匹配的字符串模式和可选的模式字符串(g,i,m). var pattern = new RegExp("[fe]at","gim"); 注意: 1) 若需要匹配的字符串中包含以下元字符

  • javascript引用类型之时间Date和数组Array

    Javascript引用类型之时间Date JavaScript中的Date类型是在早期Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC 1970年1月1日零时开始经过的毫秒数来保存日期.在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285 616年. 创建日期对象 在javascript中,可以使用Date()构造函数来创建日期对象,如: 复制代码 代码如下: var date=new Date(); 当没有

  • JavaScript引用类型Date常见用法实例分析

    本文实例讲述了JavaScript引用类型Date常见用法.分享给大家供大家参考,具体如下: Date类型使用自UTC1970年1月1日午夜(零时)开始经过的毫秒数来保存日期. 创建日期对象的方法: (1)获得当前日期和时间 var date = new Date(); (2)根据特定的日期和时间创建日期对象 传入的参数:从UTC午夜开始到该日期止经过的毫秒数.为此,提供两个方法Date.parse()和Date.UTC(). 1)Date.parse()方法:接收一个表示日期的字符串,根据这个

  • JavaScript 中的引用类型Date 和RegExp的详细介绍

    目录 引用类型 & 引用值的理解 Date 引用类型 Date.parse()方法 Date.UTC()方法 继承的方法 RegExp RegExp 实例方法 exec() test() 继承的方法 引用类型 & 引用值的理解 引用值(或者对象)是某个特定引用类型的实例. 在ECMAScript中,引用类型是把数据和功能组织到一起的结构,经常被人错误的称作“类”.虽然从技术上讲JavaScript 是一门面向对象语言,但ECMAScrtipt 缺少传统的面相对象语言所具备的某些基本结构,包

  • Javascript中的异步编程规范Promises/A详细介绍

    Javascript里异步编程逐渐被大家接受,先前大家一般通过回调嵌套,setTimeout.setInterval等方式实现,代码看起来非常不直观,不看整个代码逻辑很难快速理解.Javascript里异步函数大概有I/O函数(Ajax.postMessage.img load.script load等).计时函数(setTimeout.setInterval)等. 这些我们都很熟悉,在复杂的应用中往往会嵌套多层,甚至以为某些步骤未完成而导致程序异常,最简单的例子:比如你往DOM中注入节点,你必

  • javascript中的变量作用域以及变量提升详细介绍

    变量作用域"一个变量的作用域表示这个变量存在的上下文.它指定了你可以访问哪些变量以及你是否有权限访问某个变量." 变量作用域分为局部作用域和全局作用域. 局部变量(处于函数级别的作用域)不像其他对面对象的编程语言(比方说C++,Java等等),javascript没有块级作用域(被花括号包围的):当是,javascript有拥有函数级别的作用域,也就是说,在一个函数内定义的变量只能在函数内部访问或者这个函数内部的函数访问(闭包除外,这个我们过几天再写个专题). 函数级别作用域的一个例子

  • JavaScript中的匀速运动和变速(缓冲)运动详细介绍

    一个div的运动其实就是它与浏览器边框的距离在变动.如果他变化的速率一定,那就是匀速运动:如果变化的速率不一定,那么就是变速运动.当,变化率与聚离浏览器边框的距离成比例的话,那么就可以说是div在做缓冲运动. 其实,很简单,就是用一个定时器(timer),每隔一段时间来改变div聚浏览器边框的距离. 比如匀速运动: 进入定时器:(每隔30ms做) if(是否到达终点) { 停止定时器} else do{ 改变距离} 改变距离的方法决定是匀速还是变速(缓冲)运动. 匀速的比如: 复制代码 代码如下

  • Mybatis中SqlMapper配置的扩展与应用详细介绍(1)

    奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这次研读源码的起因是Oracle和MySQL数据库的兼容性,比如在Oracle中使用双竖线作为连接符,而MySQL中使用CONCAT函数:比如Oracle中可以使用DECODE函数,而MySQL中只能使用标准的CASE WHEN:又比如Oracle中可以执行DELETE FORM TABLE WHER

  • Java中关于Collections集合工具类的详细介绍

    Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变.对集合对象实现同步控制等方法. 排序操作 reverse(List):反转 List 中元素的顺序 shuffle(List):对 List 集合元素进行随机排序 sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 sort(List,Comparator):根据指定的 C

  • JavaScript中各种引用类型的常用操作方法小结

    Object类型 Array类型 重排序方法: compare 升序: function compare(value1, value2){ if (value1<value2){ return -1; } if (value1>value2){ return 1; } else{ return 0; } } var values = [0,1,5,10,15]; values.sort(compare); console.log(values); // [0,1,5,10,15] 降序: fu

  • JavaScript中的object转换函数toString()与valueOf()介绍

    JavaScript中,object转换为boolean的操作非常简单:所有的object转换成boolean后均为true:即使是new Boolean(false)这样的object在转换为boolean后仍然为true. 复制代码 代码如下: var x = new Boolean(false); if(x){   console.log("x is true"); } 在将object转换为string或者number时,JavaScript会调用object的两个转换函数:t

  • JavaScript 中的日期和时间及表示标准介绍

    前言 本篇的介绍涵盖以下部分: 1. 时间标准指的是什么?UCT和GMT 的概念.关联和区别? 2. 时间表示标准有哪些? 3. JS 中时间的处理 日期时间标准 日期的标准就不多说了 -- 公元纪年 是为纪念犹太人耶稣(基督)的诞生.他诞生的那一年为公元1年,诞生之前的年份称为"公元前n年" 简单来说,时间的标准就是以什么时间为起点开始计时.对于年份来说,举例来说,如果不使用公元纪年法,估计全世界交流起来就困难重重了(新中国54年,估计很把很多老外整晕) 时间标准其实挺多的. 原子时

  • JavaScript中检查对象property的存在性方法介绍

    在JavaScript中,可以用四种方法来检查某个对象o是否拥有property x: 1."x" in o.in操作符可用于检查对象o中是否有x这个property.x可以是对象自身的(Own Property),也可以是从原型对象中继承而来的:x可以是enumerable的property,也可以是非enumerable的property. 2.o.x.可以通过访问o.x语句,判断其结果是否为undefined来确认x是否存在,其作用范围与in操作符相同.与in操作符不同的是:如果

随机推荐