JavaScript(二)基本引用类型
本文最后更新于:8 个月前
基本引用类型(Date、RegExp、JSON、原始值包装对象)
JavaScript(二)基本引用类型
引用值(或者对象)是某个特定引用类型的实例。在ECMAScript中,引用类型是把数据和功能组织到一起的结构。新对象通过使用new操作符后跟一个构造函数(constructor)来创建
1 |
|
在这里,Data()
就是一个构造函数(constructor),不加()
也可以
一、Date
1 |
|
1.1、创建Date对象
1 |
|
特别注意:月份下标是0-11,所以定义的时候要比真实月份减一,获取的月份也比真实小一
1.2、格式化Date
1 |
|
1.3、时间加减
1 |
|
1.4、时间比较
1 |
|
二、RegExp
参考文章:正则表达式 – 语法 | 菜鸟教程 (runoob.com)
2.1、语法
1 |
|
需要特别注意反斜杠\在RegExp构造器中的写法,示例如下:
1 |
|
2.2、正则表达式符号
- 普通符号
. | 除了换行符之外的任何单个字符 | \s\S | 匹配所有,\s是所有空白符号,\S是所有非空白符(不包括换行) |
---|---|---|---|
[ABC] | 匹配[…]中的所有字符 | [^ABC] | 匹配除了[…]里面的所有字符 |
[a-zA-Z] | 匹配所有大小写字母 | \w | 匹配字母、下划线、数字,等价于[a-zA-Z0-9_] |
\d | 匹配一个数字 |
- 特殊字符
* | 匹配前面的子表达式0或多次 | + | 匹配前面的子表达式1或多次 |
---|---|---|---|
? | 匹配前面的子表达式0或1次 | \ | 将下一个字符标记为特殊字符 |
[ | 中括号表达式的开始 | | | 指明两项之间的一个选择 |
() | 标记一个子表达式的开始和结束的位置 子表达式可以获取供以后使用 |
{n} | 匹配确定的n次,如o{2} 匹配’food’中的’oo’ |
{n,} | 至少匹配n次 | {n,m} | 至少匹配n次,至多匹配m次 |
- 非打印字符
\f | 换页符 | \r | 换行符 |
---|---|---|---|
\n | 换行符 | \t | 制表符 |
- 定位符
^ | 匹配字符串开始的位置 | $ | 匹配字符串结束的位置 |
---|---|---|---|
\b | 单词边界 | \B | 非单词边界 |
()
,(com|org)
表示从com或org当中选一个。()
还表示捕获分组,()
会把每个分组里匹配的值保存到一个数组中。
()
的副作用就是使相关的匹配被缓存,在第一个选项前放 ?: 可以消除这种副作用,即放弃当前括号捕获的内容(不会出现在结果数组中)
2.3、实例方法
实例.exec(),传入一个字符串参数,(找到匹配项)返回第一个匹配信息的数组,(没找到匹配项)返回null
两个额外属性:
index
和input
。index
表示字符串中匹配的起点,input
表示查找的字符串实例.test(),传入一个字符串参数,返回一个boolead值
1 |
|
2.4、贪婪匹配
正则匹配默认为贪婪匹配,就是匹配尽可能多的字符,但这有时并不是我们多希望的,比如
1 |
|
通过添加一个?
后缀采取非贪婪匹配
1 |
|
2.5、反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数
反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词/字符的匹配项的能力
1 |
|
2.6、?=、?<=、?!、?<!
exp1(?=epx2) | 查找exp2前面的exp1 |
---|---|
(?<=exp2)exp1 | 查找exp2后面的exp1 |
exp1(?!exp2) | 查找后面不是exp2的exp1 |
(?<!exp2)exp1 | 查找前面不是exp2的exp1 |
2.7、实例属性
1 |
|
2.8、功能
切分字符串,用正则表达式作为切分字符,比固定字符更加灵活
1
'a,b;; c d'.split(/[\s+\,\;]+/); //结果为:['a', 'b', 'c', 'd']
分组,正则表达式还有提取子串的功能,用
()
表示的就是要提取的分组(Group),匹配失败的时候返回null1
2var re = /^(\d{3})\-(\d{3,8})$/;
re.exec('010-12345'); //结果为 [ "010-12345", "010", "12345" ]
2.9、全局搜索
在正则表达式后面添加g
,表示全局匹配,全局匹配表示可以多次执行exec()
进行匹配,需要一次接一次地执行exec()
方法
1 |
|
2.10、常用正则表达式
场景 | 正则表达式 |
---|---|
提取url后缀里面的参数 | /(\w+)=(\w+)/g |
解析URL | let reg = /(\w+://)?(www.\w+(.(com|cn|\w+))(:\d)?([?]\w+=\w*(&\w+=\w*))?(#\w+)?)/g |
手机号码 | /^1[3-9][0-9]{9}$/ |
身份证号 | /(^\d{15}$)|(^\d{17}([0-9]|X)$)/ |
/^[\da-zA-Z_\.]+@\w+\.com(\.cn)?$/ ,名称+域名 |
|
文件扩展名 | /.[a-z]+$/i ,捕获文件扩展名 |
1 |
|
三、JSON
JavaScript Object Notation的缩写,JS对象符号,它是一种数据交换格式。
为了统一解析,JSON的字符串规定必须用双引号""
,Object的键也必须用双引号""
3.1、序列化
JSON.stringify(objectName)
1 |
|
还可以加上一些参数
JSON.stringify(xiaoming,null,' ')
:' '
表示按缩进输出JSON.stringify(xiaoming,['name','skills'],' ')
:传入一个Array[],筛选输出的值传入一个函数,如下:把所有属性值变成大写
1
2
3
4
5
6
7
8function convert(key,value){
if(typeof value == 'string'){
return value.toUpperCase();
}
return value;
}
JSON.stringify(xiaoming,convert,' ');
var s2 = JSON.stringify(xiaoming,['name'],convert,' '); //错误,不能这么传递参数还可以控制序列化的规则,在对象内部定义一个
toJSON()
方法1
2
3
4
5
6
7
8
9
10var xiaoming = {
...
toJSON: function(){
return{
'Name': this.name,
'Age': this.age
};
}
}
JSON.stringify(xiaoming); //只返回{"Name":"小明","Age":14}',不返回其余属性1
2
3
4
5
6
7
8
9
10
11
12var xiaoming = {
name:"xiaoming",
age:18,
toJSON: function(){
return{
'Name': this.name.toUpperCase(),
'Age': this.age
};
}
}
var s = JSON.stringify(xiaoming,['Name'],' ');
s //输出为:"{\"Name\": \"XIAOMING\"}"
3.2、反序列化
JSON.parse()
1 |
|
JSON.parse()
还可以接收一个函数,用来转换解析出的属性:
1 |
|
四、原始值包装类型
ECMAScript提供了3种特殊的引用类型:Boolean、Number和String
1 |
|
s1是一个string原始值变量,逻辑上本不应该有诸如substring的方法,但是它又成功运行了,这是因为,在此期间后台做了一些操作:
(1)创建一个String类型的实例;(2)调用实例上的特定方法;(3)销毁实例。
引用类型与原始值包装类型的主要区别在于对象的生命周期
由于String不属于集合引用类型,所以把String的诸多性质放到《JavaScript基础》-【基本数据类型】里面探究了。