欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《JavaScript高级程序设计》读书笔记(六)

程序员文章站 2024-03-26 10:06:17
...

第5章 引用类型(下)

5.4RegExp类型

ECMAScript通过RegExp类型来支持正则表达式。创建一个正则表达式:

var expression = /pattern/ flags;

模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包括字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持3个标志:

  1. g:表示全局模式
  2. i:表示不区分大小写
  3. m:表示多行模式

以上是使用字面量形式来定义正则表达式。另一种创建方法是使用RegExp构造函数,它接收两个参数:要匹配的字符串模式,可选的标志符字符串。(所有元字符都必须双重转义)

5.4.1RegExp实例属性

RegExp的每个实例都具有以下属性:

  • global:布尔值,表示是否设置了g标志;
  • ignoreCase:布尔值,表示是否设置了i标志;
  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起;
  • multiline:布尔值,表示是否设置了m标志;
  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

5.4.2RegExp实例方法

exec()方法接收一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。

返回的数组虽然是Array实例,但包含两个额外属性:indexinput。index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。

test()方法接收一个字符串参数,在模式与该参数匹配的情况下返回true;否则返回false。

RegExp实例继承的toLocaleString()和toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。valueOf()方法返回正则表达式本身。

5.4.3RegExp构造函数属性

RegExp构造函数包含一些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。可以通过两种方式访问它们,分别都有长属性名短属性名

长属性名 短属性名 说明
input $_ 最近一次要匹配的字符串
lastMatch $& 最近一次的匹配项
lastParen $+ 最近一次要匹配的捕获组
leftContext $` input字符串中lastMatch之前的文本
multiline $* 布尔值,表示是否所有表达式都使用多行模式
rightContext $’ input字符串中lastMatch之后的文本

除了上述属性之外,还有9个用于存储捕获组的构造函数属性。访问这些属性的语法是RegExp.$1RegExp.$2RegExp.$9,分别用于存储第一、第二……第九个匹配的捕获组。

5.4.4模式的局限性

ECMAScript中的正则表达式不支持的特性,见书P109.

5.5Function类型

函数实际上是对象,每个函数都是Function类型的实例,而且和其他引用类型一样具有属性和方法,函数名实际上也是一个指向函数对象的指针,不会和某个函数绑定。

5.5.1没有重载

声明了两个同名函数,后面的函数会覆盖前面的函数。

5.5.2函数声明与函数表达式

解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

5.5.3作为值的函数

因为ECMAScript中的函数本身就是变量,所以函数也可以作为来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。

5.5.4函数内部属性(常考)

在函数内部有两个特殊的对象:argumentsthis。arguments的主要用途是保存函数参数,它还有一个属性叫callee,这个属性是一个指针,指向拥有这个arguments对象的函数,它可以消除函数内部与函数名的紧耦合现象。(严格模式下,访问arguments.callee会导致错误)

this对象引用的是函数执行的环境对象。

ECMAScript5还规范了一个函数对象的属性:caller。这个属性中保存当前函数的函数的引用,如果在全局作用域中调用了当前函数,它的值为null。严格模式下,不能为函数的caller赋值,否则会导致错误。

5.5.5函数属性和方法

每个函数都包含两个属性:lengthprototype。其中,length属性表示函数希望接收的命名参数的个数。

对于ECMAScript中的引用类型而言,prototype是保存它们所有实例方法的真正所在。诸如toString()和valueOf()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。在创建自定义引用类型以及实现继承时,prototype属性的作用是极为重要的。

在ECMAScript5中,prototype属性是不可枚举的,因此使用for-in无法发现。

每个函数都包含两个非继承而来的方法:apply()call(),这两个方法的用途都是在特定作用域中调用函数,实际上等于设置函数体内this对象的值,扩充函数赖以运行的作用域。

apply()方法接收两个参数:在其中运行函数的作用域和参数数组(Array实例或arguments对象)。
call()方法传递给函数的参数必须逐个列举出来,其余和apply()方法都一样,
区别仅在接收参数的方式不同。
ECMAScript5还定义了一个bind()方法,它会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

每个函数继承的valueOf()、toLocaleString()和toString()方法始终都返回函数的代码。

5.6基本包装类型

为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:BooleanNumberString,它们和其他引用类型相似,同时也具有与各自基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,让我们能够调用一些方法来操作这些数据。

引用类型和基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。

5.6.1Boolean类型

Boolean类型是与布尔值对应的引用类型,建议永远不要使用。

Boolean类型的实例重写了valueOf()方法,返回基本类型值true或false;重写了toString()方法,返回字符串“true”或“false”。

5.6.2Number类型

Number是与数字值相对应的引用类型,不建议直接实例化Number类型。

Number类型重写了valueOf()方法返回对象表示的基本类型的数值,toLocaleString()和toString()方法返回字符串形式的数值。

除了继承的方法,Number类型还提供了一些用于将数值格式化为字符串的方法:

  • toFixed()方法:按照指定的小数位返回数值的字符串表示。
  • toExponential()方法:接收一个参数指定输出结果的小数位数,返回以指数表示法表示的数值的字符串形式。
  • toPrecision()方法:可能会返回固定大小格式,也可能返回指数格式;接收一个参数,即表示数值的所有数字的位数(不包括指数部分)。

5.6.3String类型

String类型是字符串的对象包装类型。

String类型继承的valueOf()、toLocaleString()和toString()方法,都返回对象所表示的基本字符串值。

String类型的每个实例都有一个length属性,表示字符串中包含多少个字符。

1.字符方法

用于访问字符串中特定字符的方法:charAt()charCodeAt()。这两个方法都接收一个参数,即基于0的字符位置。其中,charAt()方法以单字符字符串的形式返回给定位置的那个字符。如果要得到字符编码,则使用charCodeAt()方法。
其次,还可以通过方括号加数字索引来访问字符串中的特定字符。

2.字符串操作方法

concat()方法用于将一或多个字符串拼接起来,返回拼接得到的新字符串。
ECMAScript还提供了三个基于子字符串创建新字符串的方法:slice()substr()substring()。这三个方法都会返回被操作字符串的一个子字符串,而且也接收一或两个参数。第一个参数指定子字符串的开始位置,第二个操作数表示子字符串到哪里结束。

slice()substring()的第二个参数指定的是子字符串最后一个字符后面的位置。而substr()的第二个参数指定的是返回的字符个数。

在传递给这些方法的参数是负值的情况下,它们的行为不同。其中,slice()方法会将传入的负值与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而第二个负的参数转换为0。最后,substring()方法把所有负值参数都转换为0.

3.字符串位置方法

indexOf()lastIndexOf()方法,都是从一个字符串中搜索给定的子字符串,然后返回子字符串的位置。

4.trim()方法

trim()方法会创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。
trimLeft()trimRight()方法分别用于删除字符串开头和末尾的空格。

5.字符串大小写转换方法

toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase().

6.字符串的模式匹配方法

match()方法接收一个参数,正则表达式或是RegExp对象,本质上和调用RegExp的exec()方法一样。

search()方法参数和match()一样,返回字符串中第一个匹配项的索引。

replace()方法替换子字符串。

split()方法基于指定的分隔符将一个字符串分割成多个字符串,并把结果放进一个数组。

7.localeCompare()方法

localeCompare()方法比较两个字符串,并根据大小比较返回值。

8.fromCharCode()方法

fromCharCode()方法接收一或多个字符编码,将它们转换成一个字符串。

5.7单体内置对象

5.7.1Global对象

所有在全局作用域中定义的属性和函数,都是Global对象的属性。

1.URI编码方法

encodeURI()encodeURIComponent()方法可以对URI进行编码。encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。
对应的解码方法为decodeURI()decodeURIComponent()

2.eval()方法

eval()只接收一个参数,即要执行的ECMAScript字符串。

5.7.2Math对象

1.Math对象的属性

属性 说明
Math.E 自然对数的底数,即常量e的值
Math.LN10 10的自然对数
Math.LN2 2的自然对数
Math.LOG2E 以2为底e的对数
Math.LOG10E 以10为底e的对数
Math.PI 圆周率的值
Math.SQRT_2 1/2的平方根
Math.SQRT2 2的平方根

2.min()和max()方法

min()max()方法用于确定一组数值中的最小值和最大值。

3.舍入方法

Math.ceil()执行向上舍入,Math.floor()执行向下舍入,Math.round()执行标准舍入。

4.random()方法

random()方法返回大于等于0小于1的一个随机数

从某个整数范围内随机选择一个值:

= Math.floor(Math.random() * 可能值的总数 + 第一个可能的值)

5.其他方法

见P136

相关标签: JS学习