引用类型 & 引用值的理解

引用值(或者对象)是某个特定引用类型实例。 在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内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

JavaScript 中的引用类型Date 和RegExp的详细介绍的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  6. 对于NSManagedObject,Xcode 9构建了Date vs NSDate的问题

    Xcode9为模拟器与设备中的实体的Date类型属性生成不同的代码.我在coredata中将类设置为类别/扩展名下的codegen功能.直到Xcode8.3(最新)它一切正常.下面是Xcode9为属性自动生成的代码–在设备上:–和,在模拟器上:–有谁遇到过这个问题?对于一个有50个成员的项目来解决这个问题的最佳解决方案是什么,直到Xcode更新修复它?

  7. iOS兼容输入类型日期 – 设置最小值最大值

    我试图在UIWebViewiOS应用程序中使用jQueryMobile设置日期,值设置正确但最小和最大属性日期设置不起作用.和当我在模拟器上运行它时,当选择日期字段时,日期选择器可见,但未设置最小,最大日期.解决方法模拟器的safari不支持设置输入类型=“日期”的最小值和最大值.您可以通过导航到thissite并尝试控制来测试它.它(可能)可以在桌面浏览器上运行,但不会在模拟器的浏览器或UIWebView中运行.

  8. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  9. ios – 设置NSDataDetector的上下文日期

    假设今天是2014年1月20日.如果我使用NSDataDetector从“明天下午4点”字符串中提取日期,我将得到2014-01-21T16:00.大.但是,假设我希望NSDataDetector假装当前日期是2014年1月14日.这样,当我解析“明天下午4点”时,我将得到2014-01-15T16:00.如果我在设备上更改系统时间,我会得到我想要的.但是,有没有办法以编程方式指定它?

  10. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部