一、RegExp 类型
1、创建一个正则表达式
(1)语法(有两种方式):
var expression = / pattern / flags;
var expression = new RegExp(pattern, flags);
(2)模式(pattern)部分可以是任何简单或者复杂的正则表达式,包含字符类、限定符、分组、向前查找、以及反向引用。
(3)可带有一个或多个标志(flags),匹配模式支持 3 个标志:
参 数 | 含 义 |
i | 忽略大小写 |
g | 全局匹配,即模式将应用与所有字符串,而非在发现第一个匹配时立即停止 |
m | 多行匹配,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项 |
(4)模式中使用的所有元字符都必须转义,而使用 RegExp 构造函数,所有的元字符必须双重转义。
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。
* 元字符包括: ( [ { \ \^ \$ | ? * + . } ] )
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
(5)限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
(6)定位符:定位符使您能够将正则表达式固定到行首或行尾。
定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
2、RegExp 实例属性
* global:布尔值,表示是否设置了 g 标志
* ignoreCase:布尔值,表示是否设置了 i 标志
* lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起
* multiline:布尔值,表示是否设置了 m 标志
* source:正则表达式的字符串表示
3、RegExp 实例方法
* exec():专为捕获组设计,接收一个参数,即要应用模式的字符串,返回第一个匹配项信息的数组或者没有匹配项的时候返回 null。返回的数组包含两个额外属性:index 和 input,分别表示匹配项在字符串中的位置和应用正则表达式的字符串。
* test():接收一个字符串参数,模式与该参数匹配返回 true,否则返回 false
二、Function 类型
1、函数实际上是对象
每个函数都是 Function 类型的实例,具有属性和方法,而函数名实际上是一个指向函数对象的指针,不会与具体的函数绑定。函数通常使用函数声明语法来定义,如:
function functionName() {} var functionName = function() {}
2、函数声明与函数表达式的区别:
解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);
而函数表达式则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
3、作为值的函数:
不仅可以像传递函数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。也可以从一个函数中返回另一个函数,这是极为有用的技术。
* 要根据某个对象属性对数组进行排序的例子:
function createComparisonFunction(propertyName) {
return function(object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2) {
return -1;
}
if (value1 > value2) {
return 1;
}
return 0;
}
}
var data = [{name: "wenyi", age: 25}, {name: "l", age: 26}];
data.sort(createComparisonFunction("name"));
alert(data[0].name);//"l"
data.sort(createComparisonFunction("age"));
alert(data[0].name);//"wenyi"
4、函数内部属性
arguments:
一个类似数组对象,包含着传入函数中的所有参数。还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数,主要用于递归函数。如:
function factorial(num) {
if (num < 1) {
return 1;
}
return num * arguments.callee(num - 1);
}
this:
引用的是函数据以执行操作的对象,也就是说,this 是函数在执行时所处的作用域。注:函数的名字仅仅是一个包含指针的变量而已。如:
var name = "window";
function sayName() {
alert(this.name);
}
var person = {name: "bella", sayName: sayName};
sayName();//"window"
person.sayName();//"bella"
5、函数属性
* length:表示函数希望接收的命名参数的个数
* prototype: 保存函数所有实例方法的真实所在。
6、函数方法:
(1)apply()和 call()方法,都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。
apply()接收两个参数,第一个是运行函数的作用域,第二个是参数数组。
call()除了传入运行函数的作用域之外,必须明确的传入每一个参数。如:
function sum(num1, num2) {
return num1 + num2;
}
function applySum(num1, num2) {
sum.apply(this, arguments);
}
alert(applySum(10, 10));//20
alert(sum.apply(this, [10, 10]));//20
alert(sum.call(this, 10, 10));//20
(2)apply()和 call()方法能够扩充函数赖以运行的作用域,使得对象不需要与方法有任何耦合关系。如:
var name = "window";
function sayName() {
alert(this.name);
}
var person = {name: "Bella"};
sayName.call(this);//"window"
sayName.call(person);//"Bella"
三、Global 对象
1、URI 方法
encodeURI():对 URI 中的空格进行编码,替换成 %20。
decodeURI():对使用 encodeURI 方法进行编码的字符进行解码。
encodeURIComponent():对 URI 中的所有非字母数字字符进行编码。
decodeURIComponent():对使用 encodeURIComponent 方法进行编码的字符进行解码。
2、eval()方法:
完整的 JavaScript 解析器,接收一个参数,将传入的参数当作实际的 JavaScript 语句来解析,并把执行结果插入到原位置。能够解析代码字符串的能力非常强大,同时也非常危险。在使用 eval()时必须十分谨慎,防止恶意输入威胁安全的代码(代码注入)。
JavaScript 高级程序设计——变量、作用域和垃圾回收 - 文翼的博客