【JS笔记】标准库学习

包装对象

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的第二个参数表示从该位置起向前匹配。

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 = 1var 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的一个初级版。也确实可以称之为模板啊模板

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),表示不返回该组匹配的内容,即匹配的结果中不计入这个括号。
    在这里插入图片描述
    在这里插入图片描述
  • 先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
  • 正向和反向就是 一个是要出现,一个不让出现
    断言的判断实际上相当于是一个虚拟的条件。
  • 正向先行断言(预判断)可以用来验证密码强度。

在这里插入图片描述
在这里插入图片描述
编程胶囊-正则表达式的练习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值