包装对象
1.定义
- 对象是 JavaScript 语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”(wrapper)。
- 包装对象:与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
例子:
var v1 = new Number(123);
typeof v1 // "object"
v1 === 123 // false
- 设计目的:首先是使得“对象”这种类型可以覆盖 JavaScript 所有的值,整门语言有一个通用的数据模型,其次是使得原始类型的值也有办法调用自己的方法。
- 这三个对象作为构造函数使用(带有new)时,可以将原始类型的值转为对象;
作为普通函数使用时(不带new)时,可以将任意类型的值,转为原始类型的值。
例子:
// 字符串转为数值
Number('123') // 123
2.实例方法
- 这里介绍这三种包装对象共同具有、从Object对象继承的方法:
valueOf()
和toString()
。 valueOf()
方法返回包装对象实例对应的原始类型的值。
new Number(123).valueOf() // 123
new Boolean(true).valueOf() // true
toString()
方法返回对应的字符串形式。
new Number(123).toString() // "123"
new Boolean(true).toString() // "true"
3.原始类型与实例对象的自动转换
- 原始类型直接调用一些包装对象的属性(如
length
时),JavaScript 引擎会自动将原始类型的值转为包装对象实例,并在使用后立刻销毁实例。 - 自动转换生成的包装对象是只读的,无法修改。所以原始类型此时也不能修改属性(增加删除之类的)。
- 另一方面,调用结束后,包装对象实例会自动销毁。这意味着,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。(所以其实可以赋值,只是赋值了也没啥用)
- 如果要为此时的原始类型添加属性,只有在它的原型对象.prototype上定义。
4. 自定义方法
也是在对象的原型上定义才行内。
Boolean 对象
1. 概述
- Boolean对象是 JavaScript 的三个包装对象之一。作为构造函数,它主要用于生成布尔值的包装对象实例。
- 注意:== 所有对象(在进行逻辑运算的时候)对应的布尔值都是 true ==
new Boolean(false) 的结果是true ;valueOf()才是原始值的。
2.Boolean 函数的类型转换作用
- Boolean对象除了可以作为构造函数,还可以单独使用,将任意值转为布尔值。
- 作为普通函数使用时的一些特殊情况
- 使用双重的否运算符(!!)也可以将任意值转为对应的布尔值。
- 构造函数和工具函数 的Boolean值,有可能会得到完全相反的结果。区别就是 构造函数之后就变对象了呀。
例子:
Number 对象
1.概述
Number
对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。
2.静态属性
- Number对象拥有一些静态属性(即直接定义在Number对象上的属性,而不是定义在实例上的属性)。
- 正无穷、负无穷、非数值、最接近0的正数/负数、最大/小整数
3.实例方法
3.1 Number.prototype.toString()
- 用来将一个数值转为字符串形式。
- 可以接受一个参数,表示输出的进制。如果省略这个参数,默认将数值先转为十进制,再输出字符串;
- 只要能够让 JavaScript 引擎不混淆小数点和对象的点运算符,各种写法都能用。
10.toString(2) // 错误写法。
(10).toString(2) // "1010"
10..toString(2) // "1010"
// 其他方法还包括
10 .toString(2) // "1010"
10.0.toString(2) // "1010" (表示可以直接对一个小数使用toString方法。)
10['toString'](2) // "1010"
toString
方法只能将十进制的数,转十进制或其他进制的字符串。如果要将其他进制的数,转回十进制,需要使用parseInt
方法。
3.2 Number.prototype.toFixed()
toFixed()
方法先将一个数转为指定位数的小数,然后返回这个小数对应的字符串。- 参数为小数位数,有效范围为0到100
- 由于浮点数的原因,小数5的四舍五入是不确定的,使用的时候必须小心。
(10.055).toFixed(2) // 10.05
(10.005).toFixed(2) // 10.01
3.3 Number.prototype.toExponential()
- 用于将一个数转为科学计数法形式。
- 参数是小数点后有效数字的位数,范围为0到100。
- e 表示 10的幂
(1234).toExponential() // "1.234e+3"
(1234).toExponential(1) // "1.2e+3"
3.4 Number.prototype.toPrecision()
- 用于将一个数转为指定位数的有效数字。
- 参数为有效数字的位数,范围是1到100
- 该方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关。
(12.34).toPrecision(1) // "1e+1"
(12.34).toPrecision(2) // "12"
3.5 Number.prototype.toLocaleString()
- 接受一个地区码作为参数,返回一个字符串,表示当前数字在该地区的当地书写形式。
- 还可以接受第二个参数配置对象,用来定制指定用途的返回字符串。
(123).toLocaleString('zh-Hans-CN-u-nu-hanidec')
// "一二三"
(123).toLocaleString('zh-Hans-CN', { style: 'percent' })
// "12,300%"
(123).toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })
// "123,00 €"
- 如果参数省略,浏览器自行处理(通常使用操作系统的地区设定)。如果参数是浏览器不认识的地区码,会抛出一个错误。
4 自定义方法
Number.prototype
对象上面可以自定义方法,被Number的实例继承。- 例子
Number.prototype.add = function (x) {
return this + x;
};
(8).add(2) //10
String 对象
1.概述
String
对象是 JavaScript 原生提供的三个包装对象之一,用来生成字符串对象。- 字符串对象是一个类似数组的对象(很像数组,但不是数组)。
- 字符串对象有键值对和length属性,可以像数组那样取值。
- 用作构造函数 或者 工具函数
2.静态方法
String.fromCharCode()
:参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串。
String.fromCharCode(104, 101, 108, 108, 111)
- JavaScript 默认支持两个字节的字符。码点不能大于0xFFFF(即十进制的 65535)。会出错。
- 码点大于0xFFFF的字符的四字节字符,在JS中拆成2个二字节字符表示。四字节表示法由 UTF-16 编码方法决定。
3.实例属性
String.prototype.length
返回字符串的长度。
4. 实例方法
4.1 String.prototype.charAt()
- charAt方法返回指定位置的字符,参数是从0开始编号的位置。
- 这个方法完全可以用数组下标替代。
- 如果参数为负数,或大于等于字符串的长度,charAt返回空字符串。
4.2 String.prototype.charCodeAt()
- 返回字符串指定位置的 Unicode 码点(十进制表示),相当于
String.fromCharCode()
的逆操作。 - 无参数时返回首字符的Unicode码点。
- 如果参数为负数,或大于等于字符串的长度,charCodeAt返回NaN。
- 运行该方法一次,只返回二字节字符的码点;四字节字符的码点,要连续使用2次该方法,
4.3 String.prototype.concat()
- 不改变原字符串。
concat
方法用于连接两个字符串,返回一个新字符串- 可以接受多个参数。
- 如果参数不是字符串,concat方法会将其先转为字符串,然后再连接。
- 加号运算符在两个运算数都是数值时,不会转换类型~~(这可能也是因为加号它是运算符嘛,concat在这里是基于字符串数据类型/对象的一种方法,那肯定要有所区别的)~~
4.4 String.prototype.slice()
- 不改变原字符串
- 用于从原字符串取出子字符串并返回
- 它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。
- 如果参数是负值,表示从结尾开始倒数计算的位置,即该负值加上字符串长度。(跟对象的这个方法一样一样滴)
- 如果第一个参数大于第二个参数(正数情况下),slice()方法返回一个空字符串。
4.5 String.prototype.substring()
- 不改变原字符串
- 用于从原字符串取出子字符串并返回,跟slice方法很相像。
- 区别:
- 如果第一个参数大于第二个参数,substring方法会自动更换两个参数的位置。
- 如果参数是负数,substring方法会自动将负数转为0。
'JavaScript'.substring(4, -3) // "Java" // -3 变0,又换位置,变(0,4),所以结果是JAVA
- 规则违反直觉(容易误会吧),优先使用slice,这个方法不常用的。
4.6 String.prototype.substr()
- 不改变原字符串
- 用于从原字符串取出子字符串并返回,跟slice和substring方法的作用相同。
- 区别:
- 第一个参数是子字符串的开始位置(从0开始计算),第二个参数是子字符串的长度。
- 如果第一个参数是负数,表示倒数计算的字符位置。如果第二个参数是负数,将被自动转为0,因此会返回空字符串。
- (也就是说,如果要使用的话,第一个参数可以是负数,第二个参数要么是空,要么是整数)
4.7 String.prototype.indexOf(),String.prototype.lastIndexOf()
- 用于确定一个字符串在另一个字符串中第一次出现的位置,返回结果是匹配的位置。如果返回-1,就表示不匹配。
indexOf
方法还可以接受第二个参数,表示从该位置开始向后匹配。lastIndexOf
方法的用法跟indexOf方法一致,区别:- lastIndexOf从尾部开始匹配,
indexOf
则是从头部开始匹配。 lastIndexOf
的第二个参数表示从该位置起向前匹配。
- lastIndexOf从尾部开始匹配,
4.8 String.prototype.trim()
- 不改变原字符串。
- 用于去除字符串两端的空格(或者制表符(\t、\v)、换行符(\n)和回车符(\r)),返回一个新字符串
4.9 String.prototype.toLowerCase(),String.prototype.toUpperCase()
- 不改变原字符串。
toLowerCase
方法用于将一个字符串全部转为小写,toUpperCase
则是全部转为大写。它们都返回一个新字符串
4.10 String.prototype.match()
- 用于确定原字符串是否匹配某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回null。
- 返回的数组还有index属性和input属性,分别表示匹配字符串开始的位置和原始字符串。
- (其实看起来返回的数组成员就是 子字符串,如果有匹配的话。一个字符对应一个index。
- match方法还可以使用正则表达式作为参数
-正则表达式
(神奇又灵活啊)~(感觉前面 用[/ t /] 啥啥来筛选邮箱,看起来也像是用了正则表达式?)~~
4.11 String.prototype.search(),String.prototype.replace()
search
方法的用法基本等同于match
,但是返回值为匹配的第一个位置(就相当于match里的index)。如果没有找到匹配,则返回-1。search
方法还可以使用正则表达式作为参数replace
方法用于替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有g修饰符的正则表达式)。
'aaa'.replace('a', 'b') // "baa"
'aaa'.replace(/[a]/g, 'b') // 'bbb' 正则表达式的简单例子
4.12 String.prototype.split()
- split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。
- 一些细节
- 如果满足分割规则的两个部分紧邻着(即两个分割符中间没有其他字符),则返回数组之中会有一个空字符串。
- 如果满足分割规则的部分处于字符串的开头或结尾(即它的前面或后面没有其他字符),则返回数组的第一个或最后一个成员是一个空字符串。
- split方法还可以接受第二个参数,限定返回数组的最大成员数。
'a||c'.split('|') // ['a', '', 'c']
'|b|c'.split('|') // ["", "b", "c"]
'a|b|c'.split('|', 2) // ["a", "b"]
- 可以使用正则表达式作为参数
4.13 String.prototype.localeCompare()
- locale: noun, 现场;〈正式〉(小说发生或电影拍摄的)场所
- 用于比较两个字符串。它返回一个整数(其实也就是1,0,-1),如果小于0,表示第一个字符串小于第二个字符串;如果等于0,表示两者相等;如果大于0,表示第一个字符串大于第二个字符串。
- 最大特点,就是会考虑自然语言的顺序。举例来说,正常情况(按Unicode码点比较)下,大写的英文字母小于小写字母。(因为大写在前面,码点也小点)
- 有第二个参数,指定所使用的语言(默认是英语),然后根据该语言的规则进行比较。
Math 对象
1.概述与静态属性
概述
- Math是 JavaScript 的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。
静态属性
- 提供一些数学常量。e、2的自然对数、Π……
- 常量是只读的,不可修改
2.静态方法
Math.abs() :绝对值
// x < 0 ? Math.ceil(x) : Math.floor(x); 可以实现总是返回数值的整数部分。
Math.ceil():向上取整
Math.floor():向下取整
//如果参数为空, Math.min返回Infinity, Math.max返回-Infinity。
Math.max():最大值
Math.min():最小值
//返回以第一个参数为底数、第二个参数为指数的幂运算值。
Math.pow():幂运算
//如果参数是一个负值,则返回NaN。
Math.sqrt():平方根
Math.log():自然对数
Math.exp():e的指数
//等同于Math.floor(x + 0.5)
Math.round():四舍五入
注意:Math.round(-1.5) // -1
//任意范围的随机数生成函数:定范围的range+ 偏移量
//再包裹一个Math.floor,随机整数生成函数也可实现。
//也可以结合其他的函数实现返回随机字符。
Math.random():随机数
//一系列三角函数方法
Math.sin()
……
Date 对象
- Date对象是 JavaScript 原生的时间库。它以国际标准时间(UTC)1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒)。
- 可当作构造函数使用,也可做普通函数
1.普通函数的用法
- 直接调用时(无论是否有参数),都返回当前时间。
2.构造函数的用法
- 使用new命令,会返回一个Date对象的实例。如果不加参数,实例代表的就是当前时间。
- 特别:其他对象求值调用
.valueOf()
方法,Date实例求值,默认调用toString()
方法(返回对应时间的字符串) - 只要是能被
Date.parse()
方法解析的字符串,都可以当作参数。- 负整数代表1970年元旦之前的时间。
- 参数为年、月、日等多个整数时,年和月是不能省略的,其他参数都可以省略。如果只使用“年”这一个参数,Date会将其解释为毫秒数。
- 年:使用四位数年份,比如2000。如果写成两位数或个位数,则加上1900,即10代表1910年。如果是负数,表示公元前。
月:0表示一月,依次类推,11表示12月。- 除了日期的默认值为1,小时、分钟、秒钟和毫秒的默认值都是0。
- 参数如果超出了正常范围,会被自动折算。
- 日期设为0,就代表上个月的最后一天。
- 参数还可以使用负数,表示扣去的时间。从基准日(未定的值都为0)扣去相应的时间。
3.日期的运算
类型自动转换时,Date实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期实例对象进行减法运算时,返回的是它们间隔的毫秒数;进行加法运算时,返回的是两个字符串连接而成的新字符串。
var d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
d2 - d1
// 2678400000
d2 + d1
// "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"
可能是跟数据类型,+ 和 - 的用法 有关。
4.静态方法
4.1 Date.now()
- 返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000。
4.2 Date.parse()
- parse v.(对句子)作语法分析;作句法分析
- 用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数。
- 日期字符串标准格式
YYYY-MM-DDTHH:mm:ss.sssZ
Z表示时区。其他格式也可以被解析。 - 如果解析失败,返回NaN。
4.3 Date.UTC()
- 接受年、月、日等变量作为参数,返回该时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数。
(都得是正整数才行吧) - 用法与
Date
构造函数完全一致,比如月从0开始计算,日期从1开始计算。 - 区别在于
Date.UTC
方法的参数,会被解释为 UTC 时间(世界标准时间),Date构造函数的参数会被解释为当前时区的时间。(返回的结果也不同,UTC返回毫秒数,Date返回一个字符串。)
5 实例方法
- Date的实例对象,有几十个自己的方法,除了valueOf和toString,可以分为以下三类。
to类:从Date对象返回一个字符串,表示指定的时间。
get类:获取Date对象的日期和时间。
set类:设置Date对象的日期和时间。
5.1 Date.prototype.valueOf()
- 返回实例对象距离时间零点(1970年1月1日00:00:00 UTC)对应的毫秒数,该方法等同于
getTime
方法。 - 预期为数值的场合,Date实例会自动调用该方法,可以直接用减法计算时间间隔。
5.2 to 类方法
- 获得比较完整的一段时间或日期。
(1)Date.prototype.toString() - 返回一个完整的日期字符串。
- 是默认的调用方法
(2)Date.prototype.toUTCString()
- 返回对应的 UTC 时间,也就是比北京时间晚8个小时。
(3)Date.prototype.toISOString()
- 返回对应时间的 ISO8601 写法(返回的总是 UTC 时区的时间)
(4)Date.prototype.toJSON()
- 返回一个符合 JSON 格式的 ISO 日期字符串,与toISOString方法的返回结果完全相同。
(5)Date.prototype.toDateString()
- 返回日期字符串(不含小时、分和秒)。
(6)Date.prototype.toTimeString()
- 返回时间字符串(不含年月日)。
(7)本地时间
- 将 Date 实例转为表示本地时间的字符串。
Date.prototype.toLocaleString():完整的本地时间。
Date.prototype.toLocaleDateString():本地日期(不含小时、分和秒)。
Date.prototype.toLocaleTimeString():本地时间(不含年月日)。
- 返回格式根据浏览器语言版本确定显示。
- 这三个方法都有两个可选的参数。
locales
是一个指定所用语言的字符串,options
是一个配置对象。locales
可选‘en-US’
和‘zh-CN’
之类的options
可以配置更多种需求啦。
5.3 get 类方法
-
用来获取实例对象某个方面的值。
-
注意:只有日期是 1-31的,其他 分秒时、星期、月份 都是从0 开始的(比较违反常识的就是星期和月份了。月份用的比较多,要注意,写的是11 其实表示就是12月了~
-
getUTCDate()…… 也有一系列可以返回UTC时间的方法
5.4 set 类方法
-
设置实例对象的各个方面。(也是设置具体的某个值)
-
基本是跟get*方法一一对应的,但是没有setDay方法,因为星期几是计算出来的,而不是设置的。
-
d2.setDate(-1)表示设为上个月的倒数第二天
-
set类方法和get类方法,可以结合使用,得到相对时间。
var d = new Date();
// 将日期向后推1000天
d.setDate(d.getDate() + 1000);//返回毫秒数
d.toString(d.setDate(d.getDate() + 1000));//返回字符串
- set*系列方法除了setTime(),都有对应的 UTC 版本,即设置 UTC 时区的时间。
RegExp 对象
- RegExp对象提供正则表达式的功能。
1.概述
- 正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。
- 新建正则表达式有两种方法。
- 一种是使用字面量,以斜杠表示开始和结束。(更常用,因为效率高,方便直观)
- 另一种是使用RegExp构造函数。
- 接受第二个参数,表示修饰符
2. 实例属性
- 正则对象的实例属性分成两类。
- 一类是修饰符相关,用于了解设置了什么修饰符。
- g表示是全局搜索。
- 另一类是与修饰符无关的属性
3.实例方法
3.1 RegExp.prototype.test()
- 正则实例对象的
test
方法返回一个布尔值,表示当前模式是否能匹配参数字符串。 - 如果正则表达式带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。(也就是此时,它的lastIndex会随之改变)
- 开启全局搜索时(也就是带个g修饰符),可以用
lastIndex
属性指定开始搜索的位置。(指定搜索位置后,如果找不到了,lastIndex
就会重新=0,开始搜索)(有一种循环的感觉吧,(像是word里的全局匹配查找这种)) - 带有g修饰符时,
lastIndex
属性会被记住,所以如果此时更换要匹配的字符串,会有一些错误。相当于让匹配位置置0后再重新匹配。(存在问题)
var r = /bb/g;
r.test('bb') // true
r.test('-bb-') // false
r.test('-bb-') // true
lastIndex
属性只对同一个正则表达式有效。(不能直接用正则表达式来做循环判断的标志之类的)
目的可能是想循环3次,数出a的个数这样。正确的做法应该是什么样呢?可以思考一下。一个笨笨方法。
var count = 0;var flag = 1;
var string1 = 'babaa';var r = /a/g;var li = 0;
while (flag) {
r.lastIndex = li
if (r.test(string1)) {
li = r.lastIndex
count++;
} else {
flag = 0;
}
console.log(count)
}
// 1,2,3
3.2 RegExp.prototype.exec()
- 正则实例对象的
exec()
方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串(其实也就是正则对象0.0),否则返回null
。 - 组匹配。整个数组的length属性等于组匹配的数量再加1。
var s = '_x_xy11y1xxx';
var r = /_(xy)(11)/;
r.exec(s) // ['_xy11', 'xy', '11']
- exec()方法的返回数组还包含以下两个属性:
input:整个原字符串。
index:模式匹配成功的开始位置(从0开始计数)
- 上面代码中的
index
属性等于1,是因为从原字符串的第二个位置开始匹配成功。 - 如果正则表达式加上g修饰符,则可以使用多次
exec()
方法,下一次搜索的位置从上一次匹配成功结束的位置开始。 - 字符串已经到达尾部时,匹配结果返回null,所以在循环里可以不用再额外设置flag之类的判断。
var reg = /a/g;
var str = 'abc_abc_abc'
while(true) {
var match = reg.exec(str);
if (!match) break;
console.log('#' + match.index + ':' + match[0]);
}
// #0:a
// #4:a
// #8:a
- 正则实例对象的
lastIndex
属性不仅可读,还可写。设置了g修饰符的时候,只要手动设置了lastIndex
的值,就会从指定位置开始匹配。
4.字符串的实例方法
- 字符串的实例方法之中,有4种与正则表达式有关。
String.prototype.match()
:返回一个数组,成员是所有匹配的子字符串。- 如果正则表达式带有g修饰符,则该方法与正则对象的exec方法行为不同,会一次性返回所有匹配成功的结果。
- 设置正则表达式的
lastIndex
属性,对match
方法无效,匹配总是从字符串的第一个字符开始。
String.prototype.search()
:按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。- 字符串对象的
search
方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1。
- 字符串对象的
String.prototype.replace()
:按照给定的正则表达式进行替换,返回替换后的字符串。- 正则表达式如果不加g修饰符,就替换第一个匹配成功的值,否则替换所有匹配成功的值。
replace
方法的一个应用,就是消除字符串首尾两端的空格,/^\s+|\s+$/g
replace
方法的第二个参数可以使用美元符号$,用来指代所替换的内容。
例子:1.将匹配的组互换位置;2.改写匹配的值
replace
方法的第二个参数还可以是一个函数,将每一个匹配内容替换为函数返回值。- 作为replace方法第二个参数的替换函数,可以接受多个参数。
四个括号产生四个组匹配,在匹配函数中用$1到$4表示。匹配函数的作用是将价格插入模板中。
感觉很像现在使用的JS,HTML的一个初级版。也确实可以称之为模板啊模板
- 作为replace方法第二个参数的替换函数,可以接受多个参数。
String.prototype.split()
:按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。
- 接受两个参数,第一个参数是正则表达式(或者普通的表示分隔规则字符串【如 ‘,’】),表示分隔规则,第二个参数是返回数组的最大成员数。
- 如果正则表达式带有括号,则括号匹配的部分也会作为数组成员返回。
(也就是如果有括号,组匹配的字符串也变成了数组成员,有几个组,就多几个数组成员)
5 匹配规则
5.1 字面量字符和元字符
- 字面量字符 :表示它字面的含义
- 元字符:
- 点字符(.):匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。注意,对于码点大于0xFFFF字符,点字符不能正确匹配,会认为这是两个字符。
- 位置字符位置字符用来提示字符所处的位置,主要有两个字符。
^ 表示字符串的开始位置
$ 表示字符串的结束位置 - 选择符(|):竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog。
其他的元字符还包括\、*、+、?、()、[]、{}等,将在下文解释。
5.2 转义符
- 正则表达式中那些有特殊含义的元字符,如果要匹配它们本身,就需要在它们前面要加上反斜杠。比如要匹配+,就要写成+。
- 正则表达式中,需要反斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和\。
- 需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。
(new RegExp('1\\+1')).test('1+1')
5.3 特殊字符
感觉不是特别特别常用
5.4 字符类
- 表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内,比如[xyz] 表示x、y、z之中任选一个匹配。
- 有两个字符在字符类中有特殊含义。
(1)脱字符(^):- 如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,其他字符都可以匹配。
- 如果方括号内没有其他字符,即只有[^],就表示匹配一切字符,其中包括换行符。相比之下,点号作为元字符(.)是不包括换行符的。
(2)连字符(-):
- 对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围.
- 只有当连字号用在方括号之中,才表示连续的字符序列。
- 连字符还可以用来指定 Unicode 字符的范围。
- 不要过分使用连字符,设定一个很大的范围,否则很可能选中意料之外的字符。([A-z]的ASCII编码之中,大小写字母之间还有其他的字符,可能因为其中其他的字符而报错。
5.5 预定义模式
- 预定义模式指的是某些常见模式的简写方式。
- 通常,正则表达式遇到换行符(\n)就会停止匹配。
5.6 重复类
- 模式的精确匹配次数,使用大括号({})表示。{n}表示恰好重复n次,{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次。
5.7量词符
- 量词符用来设定某个模式出现的次数。
? 问号表示某个模式出现0次或1次,等同于{0, 1}。
* 星号表示某个模式出现0次或多次,等同于{0,}。
+ 加号表示某个模式出现1次或多次,等同于{1,}。
5.8贪婪模式
- 上一小节的三个量词符,默认情况下都是最大可能匹配,即匹配到下一个字符不满足匹配规则为止。这被称为贪婪模式。
- 在量词符后面加一个问号,可以将贪婪模式改为非贪婪模式(最小可能匹配,只要一发现匹配,就返回结果,不要往下检查)
+?:表示某个模式出现1次或多次,匹配时采用非贪婪模式。
*?:表示某个模式出现0次或多次,匹配时采用非贪婪模式。
??:表格某个模式出现0次或1次,匹配时采用非贪婪模式。
5.9修饰符
- 修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部。
- 修饰符可以单个使用,也可以多个一起使用。
(1)g 修饰符
- 正则对象将匹配全部符合条件的结果,主要用于搜索和替换。
(2)i 修饰符
- 默认情况下,正则对象区分字母的大小写,加上i修饰符以后表示忽略大小写(ignoreCase)。
(3)m 修饰符
- m修饰符表示多行模式(multiline),会修改和$的行为。默认情况下(即不加m修饰符时),^和$匹配字符串的开始处和结尾处,加上m修饰符以后,和 还 会 匹 配 ∗ ∗ 行 首 ∗ ∗ 和 ∗ ∗ 行 尾 ∗ ∗ , 即 和 还会匹配**行首**和**行尾**,即^和 还会匹配∗∗行首∗∗和∗∗行尾∗∗,即和会识别换行符(\n)。
/world$/.test('hello world\n') // false
/world$/m.test('hello world\n') // true
/^b/m.test('a\nb') // true
5.10 组匹配
- 注意,使用组匹配时,不宜同时使用g修饰符,否则match方法不会捕获分组的内容。
- (?:x)称为非捕获组(Non-capturing group),表示不返回该组匹配的内容,即匹配的结果中不计入这个括号。
- 先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
- 正向和反向就是 一个是要出现,一个不让出现
断言的判断实际上相当于是一个虚拟的条件。 - 正向先行断言(预判断)可以用来验证密码强度。