《前端》JavaScript 高級程序設計——引用類型(RegExp、Function、Global)

 

https://blog.wenzhixin.net.cn/2012/04/05/javascript-advanced-programming-reference-types-regexp-function-global/

一、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 高級程序設計——變量、作用域和垃圾回收 - 文翼的博客  

https://blog.wenzhixin.net.cn/2012/03/24/javascript-advanced-programming-variables-scope-and-garbage-collection/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章