《JavaScript高级程序设计》读书笔记(六)
第5章 引用类型(下)
5.4RegExp类型
ECMAScript通过RegExp类型来支持正则表达式
。创建一个正则表达式:
var expression = /pattern/ flags;
模式(pattern)
部分可以是任何简单或复杂的正则表达式,可以包括字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags)
,用以标明正则表达式的行为。正则表达式的匹配模式支持3个标志:
-
g:表示
全局模式
; -
i:表示
不区分大小写
; -
m:表示
多行模式
;
以上是使用字面量形式
来定义正则表达式。另一种创建方法是使用RegExp构造函数
,它接收两个参数:要匹配的字符串模式,可选的标志符字符串。(所有元字符都必须双重转义)
5.4.1RegExp实例属性
RegExp的每个实例都具有以下属性:
-
global
:布尔值,表示是否设置了g标志; -
ignoreCase
:布尔值,表示是否设置了i标志; -
lastIndex
:整数,表示开始搜索下一个匹配项的字符位置,从0算起; -
multiline
:布尔值,表示是否设置了m标志; -
source
:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
5.4.2RegExp实例方法
exec()方法
接收一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。
返回的数组虽然是Array实例,但包含两个额外属性:index
和input
。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.$1
、RegExp.$2
…RegExp.$9
,分别用于存储第一、第二……第九个匹配的捕获组。
5.4.4模式的局限性
ECMAScript中的正则表达式不支持的特性,见书P109.
5.5Function类型
函数实际上是对象,每个函数都是Function类型的实例,而且和其他引用类型一样具有属性和方法,函数名
实际上也是一个指向函数对象的指针
,不会和某个函数绑定。
5.5.1没有重载
声明了两个同名函数,后面的函数会覆盖前面的函数。
5.5.2函数声明与函数表达式
解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
5.5.3作为值的函数
因为ECMAScript中的函数本身就是变量,所以函数也可以作为值
来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。
5.5.4函数内部属性(常考)
在函数内部有两个特殊的对象:arguments
和this
。arguments的主要用途是保存函数参数,它还有一个属性叫callee
,这个属性是一个指针,指向拥有这个arguments对象的函数,它可以消除函数内部与函数名的紧耦合现象
。(严格模式下,访问arguments.callee会导致错误)
this对象引用的是函数执行的环境对象。
ECMAScript5还规范了一个函数对象的属性:caller
。这个属性中保存当前函数的函数的引用,如果在全局作用域中调用了当前函数,它的值为null。严格模式下,不能为函数的caller赋值,否则会导致错误。
5.5.5函数属性和方法
每个函数都包含两个属性:length
和prototype
。其中,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个特殊的引用类型:Boolean
、Number
和String
,它们和其他引用类型相似,同时也具有与各自基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,让我们能够调用一些方法来操作这些数据。
引用类型和基本包装类型的主要区别就是对象的生存期。使用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进阶知识—函数
推荐阅读
-
《JavaScript高级程序设计》读书笔记(六)
-
10.2 DOM 操作技【JavaScript高级程序设计】 博客分类: javascript javascript
-
12.2.1 访问元素的样式【JavaScript高级程序设计第三版】 博客分类: javascript javascript
-
4.2 执行环境及作用域【JavaScript高级程序设计第三版】 博客分类: javascript javascript
-
13.4.3 鼠标与滚轮事件【JavaScript高级程序设计第三版】 博客分类: javascript javascript
-
14.5 富文本编辑【JavaScript高级程序设计第三版】 博客分类: javascript javascript富文本
-
JavaScript 高级程序设计 客户端与服务器端的通信
-
高程读书笔记 第六章 面向对象程序设计
-
[读书笔记]高级字符驱动程序(第六章)
-
Python高级编程 读书笔记: 11、第六章_类工厂