- 全棧開發實戰寶典
- 優逸客科技有限公司
- 10585字
- 2020-06-11 16:16:39
第5章 原生對象
本章主要內容
● Object對象
● Math對象
● 字符串對象
● 數組對象
● 日期對象
● 正則
● Set數據結構
● Map數據結構
對象分為內置對象(如Math)、本地對象(如String、Array)和宿主對象(BOM和DOM),本章將對這些內容進行詳細介紹。
5.1 Object對象
Object是JavaScript 中常用的一個數據類型,并且在JavaScript 中所有的對象都是繼承自 Object 對象。在對象一章中只是簡單地用Object 結合new 構造函數來創建一個對象,并沒有過多地使用。但是Object對象其實包含了很多有用的屬性和方法。因此,本節將從最基本的開始詳細介紹Object對象常用的方法以及應用。
5.1.1 Object的常用方法
1.Object.create()
在ECMAScript 5 中定義了名為Object.creat()的方法,該方法可以創建一個擁有指定原型和若干個指定屬性的對象。其中第一個參數是要繼承的原型,如果不是一個子函數,則可以傳入一個null,第二個參數是對象的屬性描述符,這個參數是可選的。
Object.create()是一個靜態函數,而不是提供給某個對象調用的方法,只需傳入所需的原型對象和屬性描述即可。
在JavaScript中,屬性有兩種類型,分別是數據屬性和訪問器屬性。
(1)數據屬性
數據屬性可以理解為平時定義對象時賦予的屬性,它可以進行讀和寫。但是,ES5中定義了一些特性,這些特性用來描述屬性的各種特征,特性是內部值,不能直接訪問到。屬性的特性會有一些默認值,要修改特性的默認值,必須使用ES5定義的新方法(Object.defineProperty方法)來修改。下面具體介紹每個特性。
1)writable:表示屬性值是否可修改,默認為true。
2)value:表示屬性的值,默認為undefined。
示例:
說明:上述示例中,通過value 這個特性,可以設定對象的默認值,且當writable 屬性設置為false時,對象的屬性值是不可以修改的。
3)configurable:該特性表示是否能夠通過delete操作符刪除屬性,默認值為true。
示例:
說明:在上述示例中,創建一個對象obj,并且給它添加屬性name,通過delete操作符刪除name屬性后,就訪問不到name屬性了。
示例:
說明:在上述示例中,創建了一個擁有指定原型 obj 的newObj 對象,并且設置configurable特性為false,最后發現依然能訪問到name屬性。
4)enumerable:表示是否能用for in 枚舉出屬性,默認值為true。
示例:
說明:在上述示例中,可以通過for in 語句枚舉obj對象的屬性。
示例:
說明:在上述示例中創建了一個擁有指定原型obj的newObj對象,并且設置enumerable特性為false,發現通過for in 語句不能枚舉newObj對象的屬性,但當設置為true時則可以。
(2)訪問屬性
1)get():表示訪問。
2)set():表示設置。
示例:
說明:在上述示例中通過方法Object.creat()創建了一個擁有指定原型 obj 的對象newObj,通過設置不同的屬性描述符,可以實現不同的操作,得到不同的結果。
2.Object.is()
它用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行為基本一致,不同之處只有兩個:一是+0不等于-0,二是NaN等于自身。
示例:
3.Object.assign()
Object.assign 方法用于對象的合并,將原、源對象(source)的所有可枚舉屬性復制到目標對象(target)上。
Object.assign方法的第一個參數是目標對象,后面的參數都是源對象。
示例:
如果目標對象與源對象具有同名屬性,或多個源對象具有同名屬性,則后面的屬性會覆蓋前面的屬性。
示例:
如果只有一個參數,Object.assign方法會直接返回該參數。
示例:
如果該參數不是對象,則會先轉成對象,然后返回。
示例:
由于undefined和null無法轉成對象,因此如果它們作為參數,就會報錯。
示例:
Object.assign方法執行的是淺復制,而不是深復制。
示例:
4.Object.getOwnPropertyDescriptors()
此方法用于返回某個對象屬性的描述對象。
示例:
5.1.2 屬性的遍歷(Object對象方法的使用)
1. 屬性的可枚舉性
對象的每個屬性都有一個描述對象(Descriptor)用來控制該屬性的行為。Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述對象。
描述對象的enumerable 屬性,稱為“可枚舉性”,如果該屬性為false,則表示某些操作會忽略當前屬性。
1)for...in循環:只遍歷對象自身的和繼承的可枚舉的屬性。
2)Object.keys():返回對象自身的所有可枚舉的屬性的鍵名。
3)JSON.stringify():只串行化對象自身的可枚舉的屬性。
4)Object.assign():只復制對象自身的可枚舉的屬性。
2. 遍歷的方式
ES6中一共有5種方法可以遍歷對象的屬性。
(1)for...in
for...in循環遍歷對象自身的和繼承的可枚舉屬性(不含Symbol屬性)。
(2)Object.keys(obj)
Object.keys 返回一個數組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性)。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一個數組,包含對象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性)。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一個數組,包含對象自身的所有Symbol屬性。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys 返回一個數組,包含對象自身的所有屬性,不管是屬性名或Symbol 或字符串,也不管是否可枚舉。
通過以上5種方法遍歷對象的屬性,都遵守同樣的屬性遍歷的次序規則,具體如下:
1)首先遍歷所有屬性名為數值的屬性,按照數字排序。
2)其次遍歷所有屬性名為字符串的屬性,按照生成時間排序。
3)最后遍歷所有屬性名為Symbol值的屬性,按照生成時間排序。
5.2 Math對象
JavaScript 自身有很多內置的對象,Math 就是其中之一,但是相比較其他的內置對象,Math對象可以用于執行數學任務,如獲取一個隨機數、畫一個圓等。
Math是JavaScript本來就存在的對象,即內置對象,它具有數學常數和函數的屬性與方法。Math 對象不像Date 和String 是對象的類,因此沒有構造函數,也不需要實例化,它所有的屬性和方法都是靜態的,只需把Math作為對象使用即可。
5.2.1 Math對象的屬性
1)Math.PI:圓周率。
2)Math.E:返回歐拉常數e的值。
3)Math.LN2:返回2的自然數對數。
5.2.2 Math對象的方法
Math對象的方法具體見表5-1。
表5-1

(1)abs()
abs()用于返回一個數的絕對值。
示例:
(2)round()、floor()、ceil()和trunc()
1)round()用于對一個數進行四舍五入。
2)floor()用于對一個數進行向下取整。
3)ceil()用于對一個數進行向上取整。
4)trunc()用于返回一個數的整數部分,去除小數。
示例:
如果參數是一個正數,則trunc()相當于floor();否則trunc() 相當于ceil()。
(3)max()和min()
max()和min()用于取一組數中的最大值和最小值。
示例:
(4)random()
random()用于取一個隨機數。
示例:
(5)pow(x,y)和sqrt()
pow(x,y)用于取x的y次冪,sqrt()用于獲取一個數的平方根。
示例:
(6)sin()、cos()、tan()、asin()、acos()和atan()
使用時,需要將角度轉化為弧度才能進行計算,在JavaScript中,用Math.PI表示π,轉換公式為1deg=Math.PI/180。
示例:
5.3 字符串對象
String 對象也是JavaScript 內置對象之一。當操作的數據是文本形式的數據時,用字符串對象處理再合適不過了。下面介紹有關字符串對象的創建,以及其具有的屬性和方法。
5.3.1 創建String對象
創建String對象的語法格式如下:
通過構造函數會返回一個新創建的String對象,用來存放字符串s:
不通過構造函數調用String()時,它只把s轉換成原始的字符串,并返回轉換后的值。
5.3.2 字符串對象的屬性
1)constructor:用于返回構造函數的引用。
2)length:用于計算字符串的長度。
示例:
說明:在上述示例中,通過調用String對象的length屬性,可以很方便地獲得該字符串的長度。
5.3.3 字符串對象的方法
字符串對象的方法可以大致分為獲取、查找、截取、轉換4種類型。接下來將一一進行介紹。
獲取類型有以下3種:
(1)mystr.charAt(index);
charAt方法用來返回指定索引位置(index)的字符串,若是超出有效范圍的索引值,將返回空字符串。
示例:
說明:需要注意index下標的有效范圍是從0開始到str.length-1。
(2)mystr.charCodeAt(index);
charCodeAt方法返回指定位置字符的Unicode編碼。
示例:
(3)String.fromCharCode(code1 [,code2...]);
fromCharCode是一個靜態方法,它存儲在內存的靜態區中,一直存在,直接使用即可。
fromCharCode方法接收一個(或多個)指定的Unicode 值,然后返回一個(或多個)對應的字符串。
示例:
查找類型有以下5種:
(1)mystr.indexOf(str [,startIndex]);
indexOf方法返回指定字符在字符串中第一次出現的位置。如果字符不存在,則返回-1。
示例:
說明:當指定startIndex 的值時,會從指定位置開始起查找指定的字符串,否則從字符串的開始位置查找。
(2)mystr.lastIndexOf(str [,startIndex]);
lastIndexOf 方法返回指定字符在字符串中最后一次出現的位置。如果字符串不存在,則返回-1。
示例:
說明:若指定了startIndex的值,則作用與indexOf方法一樣。
(3)mystr.match(str);
match 方法用于在字符串內檢測指定的值,或查找一個或多個正則表達式的匹配,該方法類似于indexOf和lastIndexOf方法,但是返回指定的值,沒有則返回null,而不是返回字符串的位置。
示例:
(4)mystr.search(reExp);
search方法返回與正則表達式查找內容相匹配的第一個字符串的位置,只能用于正則。
示例:
說明:reExp包含正則表達式模式和可用標志的正則表達式對象。
(5)mystr.replace(str/regExp,replacement);
replace方法用于將字符串中的一些字符替換成另外的字符,或替換一個與正則表達式匹配的字符串。返回結果為新字符串,不影響原字符串。
示例:
截取類型有以下3種:
(1)mystr.slice(start [,end]);
slice方法返回從指定位置開始截取,到指定位置結束(不包括)的字符串;start下標從0開始;如果沒有指定結束位置,則從指定位置開始截取,到末尾結束;它可以接收負值,-1表示字符串的結尾。
示例:
(2)mystr.substring(start,end);
substring 方法返回從指定位置開始截取,到指定位置結束的字符串(不包括);如果沒有指定結束位置,則從指定位置開始截取,到末尾結束;它接收到的負值會自動轉換為0。
示例:
(3)mystr.substr(start [,length]);
substr方法返回從指定位置開始截取指定長度的字符串,如果沒有指定長度,則從指定位置截取,到末尾結束;不支持負數。
示例:
說明:在上述示例中,當指定length字符個數時,會從指定的位置開始輸出一定個數的字符。
轉換類型有以下7種:
(1)mystr.split("以什么分割"[,limit]);
split方法將一個字符串分割成數組,limit用來限制返回數組中元素的個數。
示例:
(2)toLowerCase();
toLowerCase方法用于把字符串中的字母轉換為小寫,并返回一個字符串。
示例:
(3)toUpperCase();
toUpperCase方法用于將字符串中的字母轉換為大寫,并返回一個字符串。
示例:
(4)trim();
trim方法用于刪除字符串兩邊的空格。
示例:
(5)charCodeAt();與codePointAt();
在JavaScript 內部,字符以UTF-16 的格式儲存,每個字符固定為兩個字節。對于那些需要4 個字節儲存的字符(Unicode 碼點大于0xFFFF 的字符),JavaScript 會認為它們是兩個字符。
示例:
說明:上述示例中,漢字“吉”不是吉利的“吉”,是“吉”的異體字,碼點為0x20BB7。需要4 個字節的字符存儲。通過方法charCodeAt()分別返回了前兩個字節和后兩個字節的值。
ES6提供了codePointAt方法,能夠正確處理4個字節儲存的字符,返回一個字符的碼點。
上述示例中,codePointAt方法正確返回了漢字“吉”的碼點。
因此,對于32位的UTF-16字符的碼點,通過codePointAt方法能夠正確返回。對于常規的兩個字節存儲的字符,codePointAt方法和charCodeAt方法相同。
(6)String.fromCharCode();與String.fromCodePoint();
ES6提供了String.fromCodePoint方法,它與ES5中的String.fromCharCode方法一樣,用于從碼點返回對應的字符。不同之處在于,String.fromCodePoint 方法可以識別 0xFFFF 的字符,彌補了String.fromCharCode方法的不足。在作用上,正好與codePointAt方法相反。
示例:
示例輸出結果如圖5-1所示。

圖5-1
如果String.fromCodePoint方法有多個參數,則它們會被合并成一個字符串返回。
(7)repeat();
repeat方法返回一個新字符串,表示將原字符串重復n次。
示例:
5.4 數組對象
Array 數組對象也是JavaScript 的內置對象之一,常用于在單個變量中存儲多個值,且允許數組中含有不同數據類型的元素,即數組元素可以是對象或其他的數組。
5.4.1 數組對象的屬性
1)length:返回或設置數組元素的個數。因為數組的索引總是從0開始,所以一個數組的下標范圍是從0到length-1。再次注意,JavaScript數組的length屬性是可變的。
示例:
2)prototype屬性:返回對象類型原型的引用。
示例:
3)constructor屬性:表示創建對象的函數。
示例:
5.4.2 數組對象的方法
在數組中有很多預定義的方法,接下來按照分類一一進行介紹。
添加或刪除類有以下5種:
(1)myarr.push(元素1,元素2,…);
push方法用來向數組的末尾添加元素,返回值為新數組的長度;一次可以添加多個元素。
示例:
說明:通過push 方法返回的是新數組的長度,當再次訪問數組時返回的是添加后的結果,說明push方法會影響原數組。
(2)myarr.unshift(元素1,元素2,…);
unshift 方法用來向數組的開頭添加元素,返回值為新數組的長度;一次可以添加多個元素。
示例:
說明:在上述示例中,返回一個新的數組,說明unshift方法也會影響原數組。
(3)myarr.pop();
pop方法用來刪除數組中的最后一個元素,返回值為刪除的元素。
示例:
說明:在上述示例中,返回來一個新的數組,說明pop方法也會影響原數組。
(4)myarr.shift();
shift方法用來刪除數組的第一個元素,返回值為刪除的元素。
示例:
說明:在上述示例中,說明shift方法也會影響原數組。
(5)myarr.splice(index,數量,item1,item2...);
splice方法用來刪除、添加或替換數組中的元素,是個“萬能”的方法。
index:表示從哪里開始刪除或添加,必須是數值類型的(從0開始計算)。
數量:規定了刪除的個數,如果為0,則表示不刪除,否則表示添加。
示例:
說明:當用splice 方法刪除或替換元素時,會返回被刪除的元素;當用splice 方法插入元素時,會返回一個空數組。
數組的轉換方法如下:
join 方法用于將數組按照指定的分隔符轉換為字符串,如果沒有分隔符,則默認為以“,”來分隔。返回值為組成的字符串。
示例:
說明:在上述示例中,使用了不同的分隔符。
數組的截取方法如下:
slice 方法從已有的數組中返回選定的元素,即從指定位置開始截取,到指定位置(不包括)結束。如果沒有指定結束位置,則從指定位置開始,到末尾結束。支持負數(從-1 開始),返回值為新數組,不會破壞原數組。
示例:
說明:在上述示例中,當操作后再次返回數組arr時,還是原數組,表明slice方法不會影響原數組。
數組的連接方法如下:
concat方法用于連接兩個或更多個數組,并返回新數組。該方法不會影響原數組。
示例:
數組的排序方法如下:
sort方法用于對數組中的元素進行排序。排序順序可以按照字母順序或數字順序,并按升序或降序排列。如果沒有參數,則從字符的編碼開始按照順序排列。
如果有參數,則這個參數必須是一個函數(回調函數)。這個回調函數有兩個參數,即a、b。
示例:
說明:在上述示例中,sort 排序默認為升序。當元素為字符串時,會比較每個元素對應的Unicode編碼大小并進行排序。
示例:
說明:在上述示例中,通過回調函數來設置數組排序的規則是升序還是降序。
數組的過濾方法如下:
filter方法會創建一個新數組,新數組中的元素為通過檢查指定數組中符合條件的所有元素。在回調函數中定義判斷條件,返回值為所有判斷結果為真的值組成的新數組。
示例:
數組的映射方法如下:
map 方法會返回一個新數組,數組中的元素為原始數組元素調用函數處理后的值,即在回調函數中返回新值。
示例:
說明:在上述示例中,在回調函數中返回了新值,map 方法的返回值為回調函數中返回的新值組成的新數組。
數組的查找有以下兩種方法:
(1)indexOf(item)
indexOf 用來返回數組中某個指定的字符串值第一次出現的位置,從指定位置起從前向后搜素。若沒有找到,則返回-1。
如果沒有指定起始位置,將從字符串的開始位置查找。
indexOf 方法最基本的思想還是先循環整個數組,將每次循環出來的結果與要查找的元素進行匹配,最終返回我們想要的結果。接下來先從for循環入手,實現元素的查找。
示例:
萬變不離其宗,indexOf方法還是基于for循環的思想,只不過使用起來更加方便。下面再用indexOf方法實現上個示例。
示例:
說明:在上述示例中,indexOf方法實現的原理機制和for循環機制一樣。
(2)lastIndexOf(item)
lastIndexOf 方法返回數組中某個指定的字符串值最后一次出現的位置,和indexOf 方法正好相反。
示例:
說明:在上述示例中,通過lastIndexOf方法從頭到尾地檢索,看數組中是否包含1,如果找到,則返回1在數組中最后一次出現的位置。
數組的判斷有以下兩種方法:
(1)every()
every 方法用來檢測數組中的每一項元素是否符合條件,即在回調函數中進行判斷,如果有一個元素不滿足條件,則整個表達式返回false,且其他元素將不再進行判斷;如果所有元素都滿足條件,則返回true。注意,every方法不會對空數組進行檢測。
既然 every 方法是檢測數組中的每一個元素,那么此處還是先用for 循環來切入,方便大家理解記憶。
示例:
接下來再用every方法實現一下:
說明:通過以上兩個示例可以發現,every方法的實現原理還是for循環。
(2)some(function(item,index){})
some 方法用于檢測數組中的每一個元素是否滿足指定的條件,即在回調函數中對每個元素依次進行判斷,如果有一個元素滿足條件,則表達式將返回true,且其他元素將不再進行判斷;如果沒有滿足條件的元素,則返回false。注意,some 方法不會對空數組進行檢測。
同理,此處讀者也可以嘗試用for循環先實現一下。
用some方法實現,示例如下:
說明:在上述示例中,通過some 方法可以檢測數組中是否有元素小于3,并不會改變原始數組。
數組的轉換有以下兩種方法:
(1)Array.from()
Array.from 方法用于將兩個類對象轉換為真正的數組,即類似數組的對象(array-like object)和可遍歷(iterable)的對象。
示例:
Array.from方法可以處理NodeList對象和arguments對象。
示例:
(2)Array.of()
Array.of方法用于將一組值轉換為數組。
示例:
這個方法的主要目的是彌補數組構造函數Array()的不足。
示例:
5.4.3 數組對象的構造函數的方法
1)Array.from 方法用于將兩類對象轉換為真正的數組,即類似數組的對象和可遍歷的對象。
示例:
2)Array.of 方法用于將一組值轉換為數組。Array.of 方法總是返回參數值組成的數組。如果沒有參數,則返回一個空數組。
示例:
3)Array.isArray方法用于判斷某個值是否為數組,返回的值為布爾類型。
示例:
5.5 日期對象
現如今,無論是網頁中還是一個游戲中,都會涉及對時間的處理,JavaScript 專門提供了日期對象。
Date對象是JavaScript提供的日期和時間的接口操作,在JavaScript中DATE使用UTC(國際協調時間),它能夠表示的時間范圍是1970年1月1日00:00:00前后的各一億天,之前為負,之后為正,取值范圍為285616年。
日期也是JavaScript 的一個內置對象,若想對日期進行獲取和操作,就必須實例化對象。
5.5.1 定義日期對象
使用關鍵字new來定義一個Date對象,語法格式如下:
說明:日期對象會自動獲取當前的日期和時間作為初始值,包括年、月、日、時、分、秒、星期、時區。
當傳入參數時,即得到時間參數。可傳入的參數格式如下:
"時:分:秒 月/日/年"或"月/日/年時:分:秒"或字符串。
年,月,日,時,分,秒,不能加""。
不傳參會得到當前時間的信息。
Date對象可以作為普通函數直接調用,返回一個代表當前時間的字符串。
示例:
5.5.2 獲取日期信息的方法
一般在項目中會獲取一下時間相關的信息,表5-2所示是常用的獲取日期信息的方法。
表5-2

(續)

5.5.3 設置日期的方法
設置日期的方法見表5-3。
表5-3

表5-2 和表5-3 列出了常用的操作日期的方法,通過Date 對象可以很方便地對日期進行操作,下面通過示例深入理解日期對象的用法。
在下面的示例中,通過setFullYear方法設置一個日期對象為指定的日期。
示例:
日期是可以進行比較的,下面獲取當天的日期,與之前設置的日期進行比較。
示例:
下面對于日期對象的獲取方法來展示一個示例:
對于日期對象的應用,在后續章節中將通過一些示例來更好地闡述。
5.6 正則
本節將重點介紹正則表達式,簡單地說,正則表達式就是一個文本模式的匹配工具,在JavaScript 中,正則表達式一般被用來匹配字符串中的字符組合。但是為什么非得用正則表達式呢?下面通過一個示例來了解正則表達式在實際項目中的應用。
示例:
從上述示例中可知,如果不使用正則表達式,判斷會比較麻煩,使用正則表達式則簡單很多。
正則表達式雖然用起來比較簡單,但是它的規則很多。
5.6.1 正則表達式的概念
正則表達式是一個描述字符模式的對象。簡單地說,是一個用來描述或者匹配一系列符合某個語法規則的字符串的語言。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索、替換或拆分那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操作。
5.6.2 應用場合
在實際項目開發中有很多場合都需要使用正則表達式,那么哪些場合下會用到正則呢?
1)數據驗證。
2)文本替換。
3)內容檢索。
4)過濾內容。執行字符串函數無法完成的特殊的匹配、拆分、替換功能等。
5.6.3 創建正則表達式
在JavaScript中,正則表達式是通過對象的方式來創建的,它有自己的方法。
1. 通過構造函數創建
通過構造函數創建表達式又稱為顯示的創建,即通過構造函數RegExp()來實現。語法格式如下:
構造函數RegExp()有兩個參數要傳,第一個參數為正則表達式,第二個參數是一個可選項,即模式修飾符。各個修飾符的含義如下:
1)g表示全局匹配,即匹配字符串中出現的所有模式。
2)i表示忽略字母大小寫,即在匹配字符串時不區分字母大小寫。
3)m表示進行多行匹配。
如下示例中都是有效的正則表達式。
通常將正則表達式字符串放在/RegExp/中間,//稱為定界符。
匹配邊界有以下兩種情況:
(1)字符邊界
1)^ 匹配字符串的開始。
2)$ 匹配字符串的結束,忽略換行符。
(2)單詞邊界限制
1)\b 匹配單詞的邊界。
2)\B 匹配除單詞邊界以外的部分。
2. 通過字面量方式創建
通過字面量方式創建又稱為隱式創建,即將文字量的正則表達式賦值給一個變量。語法格式如下:
其中,正則表達式為指定的匹配模式,模式修飾符是可選項。
5.6.4 正則表達式的模式
1. 原子
原子是正則表達式中最小的元素,包括英文、標點符號等。每個原子都有自己特殊的含義,具體如下:
\d——匹配任意一個數字。
\D——與除了數字以外的任何一個字符匹配。
\w——與任意一個英文字母,數字或下畫線匹配。
\W——除了字母,數字、下畫線外,與任何一個字符匹配。
\s——與任意一個空白字符匹配。
\n——換行字符。
\f——換頁字符。
\r——回車字符。
\t——制表符。
\v——垂直制表符。
\S——與除了空白符以外任意一個字符匹配。
2. 原子表
方括號可用于查找某個范圍內的字符,具體如下:
[]——只匹配其中的一個原子。
[^]——匹配除了當前原子表中定義的原子外的字符。
[0-9]——匹配0~9中的任意一個數字。
[a-z]——匹配小寫a~z中的任意一個字母。
[A-Z]——匹配大寫A~Z中的任意一個字母。
3. 元字符
在正則表達式中有一些特殊字符,代表著特殊意義,叫作元字符。
. 代表除換行符以外的任何一個字符。
| 代表或的意思,匹配其中一項就代表匹配。
4. 原子分組
匹配多個字符時用()分組,分組代表一個原子集合或一個大原子,并壓入堆棧(內存)用于調用。組號是從左到右計數的,調用時如果是字面量形式,則用\1;如果是構造函數方式,則用\1,這種方式稱為反向引用。
示例:
5. 取消反向引用
使用形如(?:pattern)的正則就可以避免保存括號內的匹配結果,反向引用也將失效。
6. 量詞
可以使用一些元字符,重復表示一些元子或元字符,具體如下:
*——重復零次或更多次。
+——重復一次或更多次。
?——重復零次或一次。
{n}——重復n次。
{n,}——重復n次或更多次。
{n,m}——重復n到m次。
7. 貪婪和吝嗇
正則匹配是貪婪的,但并不意味著禁用,具體如下:
*?——重復任意次,但盡可能少重復。
+?——重復1次或更多次,但盡可能少重復。
??——重復0次或1次,但盡可能少重復。
{n,m}?——重復n到m次,但盡可能少重復。
{n,}?——重復n次以上,但盡可能少重復。
模式匹配的順序(從高到低)見表5-4。
表5-4

5.6.5 正則方法
正則表達式對象RegExp提供了兩個可用的方法:test()和exec()。
1.RegExp.test()
方法test()用來測試字符串中是否包含了匹配該正則表達式的子串,如果包含,則返回true,否則返回false。
示例:
說明:在上述示例中,使用正則表達式/uek/i 來檢測str 字符串中是否包含匹配的子串,且匹配時不區分字母大小寫。最終得到的結果是true,所以會返回并顯示“找到了指定字符串”。
2.RegExp.exec()
方法exec()功能非常強大,是一個通用的方法,用來在字符串中匹配正則,并將結果保存在一個數組中即成功返回,失敗返回null。
返回的數組包含特殊屬性:
1)input表示被查找字符串。
2)index表示子字符串位置。
如果正則表達式沒有設置g,那么exec方法不會對正則表達式有任何的影響。如果設置了g,那么exec執行后會更新正則表達式的lastIndex屬性,表示本次匹配后所匹配的字符串的下一個字符的索引,下一次再用這個正則表達式匹配字符串時就會從上次的lastIndex屬性開始匹配。
示例:
說明:方法exec()返回的數組對象還有一個擴展的屬性,且這個屬性在普通的數組中是沒有的,這個屬性是index,它返回的是匹配字符串的開始位置,除此之外,還有其他的擴展屬性,示例如下:
說明:在上述示例中,通過方法exec()返回的數組對象擴展的屬性可以獲取更多詳細的信息,最終返回結果為:“字符串長度為1;被搜索的字符串為abc de fg de;起始位置為4”。
5.6.6 字符串中用到正則的函數
在JavaScript中,正則表達式通常用于以下字符串方法:search()、replace()和split(),在字符串對象一節中也有提到過。
(1)search(regexp)
regexp 為正則表達式,返回索引位置,不支持全局索引(即g修飾符無效),找到即停止搜索。
示例:
說明:使用正則表達式搜索字符串Regexp,且不區分字母大小寫。最終返回搜索字符串的起始位置7。
(2)replace(正則或字符串,替換內容)
支持全局g修飾符,如果模式不是全局,則當匹配到一個以后將不會繼續匹配,反之則會繼續往下匹配。
示例:
說明:在上述示例中,使用正則表達式且不區分字母大小寫,將字符串中的Regexp 替換為UEK,最終返回的結果就是替換后的字符串“search UEK”。
(3)split 方法
split 方法用于拆分字符串,參數可以為字符串或正則表達式。
示例:
5.7 Set數據結構
5.7.1 Set基本用法
Set數據結構類似于數組,但是它的成員都是唯一的。
示例:
在函數Set()中可以傳入一個數組類型的參數。
示例:
在Set 中判斷是否重復,使用的是“Same-value equality”,類似于“===”,但是有例外,其中NaN不等于NaN。
示例:
5.7.2 Set屬性和方法
1. 屬性
1)Set.prototype.constructor:構造函數,默認是Set 函數。
2)Set.prototype.size:返回Set 實例的成員總數。
2. 方法
1)add(value):添加某個值,返回Set結構本身。
2)delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
3)has(value):返回一個布爾值,表示該值是否為Set的成員。
4)clear():清除所有成員,沒有返回值。
示例:
5.7.3 Set遍歷方法
Set 的遍歷順序就是插入順序。
1)keys():返回鍵名的遍歷器。
2)values():返回鍵值的遍歷器。
由于Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),因此keys 方法和values方法完全一致。
3)entries():返回鍵值對的遍歷器。
4)forEach():使用回調函數遍歷每個成員。
示例:
5.7.4 WeakSet
WeakSet的成員只能是對象,不能是其他類型的值。
WeakSet 中的對象都是弱引用,垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內存,不考慮該對象是否還存在于WeakSet 中。這意味著,無法引用WeakSet 的成員,因此WeakSet是不可遍歷的。
5.8 Map數據結構
JavaScript對象本質上是鍵值對的集合。之前,只能用字符串當作鍵。
Map 數據結構類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。
Object 結構提供了“字符串—值”的對應,Map結構提供了“值—值”的對應,是一種更完善的Hash結構實現。
所以需要“鍵值對”的數據結構時,Map比Object更合適。
5.8.1 Map 基本用法
1)Map 作為一個構造函數,可以接受一個數組當作參數。
2)Map 結構中,字符串“true”和布爾值true 是兩個不同的鍵值。
示例:
只有對同一個對象的引用,Map結構才將其視為同一個鍵。所以下例中,set和get中的[1]不是同一個鍵。
雖然NaN不嚴格相等于自身,但Map將其視為同一個鍵。
示例:
5.8.2 Map 屬性和方法
1. 屬性
size屬性用于返回Map結構的成員個數。
示例:
2. 方法
1)方法set()返回的是Map本身,因此也可以采用鏈式寫法。
示例:
2)方法get()讀取對應的鍵值,如果找不到傳入的鍵值,則返回undefined。
示例:
3)方法has()返回一個布爾值,表示該鍵值是否在Map 結構中。
示例:
4)方法delete()用于刪除某個鍵,刪除成功,則返回true;如果刪除失敗,則返回false。
示例:
5)方法clear()用于清除所有成員,沒有返回值。
示例:
5.8.3 Map 遍歷方法
1)keys():返回鍵名的遍歷器。
2)values():返回鍵值的遍歷器。
3)entries():返回所有成員的遍歷器。
示例:
5.8.4 Map與數組對象的轉換
(1)Map轉換為數組
示例:
(2)數組轉換為Map
示例:
(3)Map轉換為對象
如果所有Map的鍵都是字符串,則它可以轉換為對象。
示例:
(4)對象轉換為Map
示例:
5.8.5 WeakMap
WeakMap 結構與Map 結構基本類似,唯一的區別是它只接受對象作為鍵名(null 除外),不接受其他類型的值作為鍵名。
鍵名所指向的對象,不進入垃圾回收機制。
示例:
- 這就是搜索引擎
- HIS內核設計之道:醫院信息系統規劃設計系統思維
- 監控平臺解密:IT系統風險感知和洞察
- 網頁設計與制作項目教程(HTML+CSS+Bootstrap)
- Adobe XD界面設計與原型制作教程(全彩)
- 軟件定義網絡核心原理與應用實踐
- 深度學習:主流框架和編程實戰
- 用Microsoft Project 2007構建企業項目管理信息系統
- 網站說服力(第3版)
- Google Plus First Look:a tip-packed,comprehensive look at Google+
- NS2仿真實驗
- 新手易學:黑客攻防入門
- Learning Bing Maps API
- Dreamweaver+PHP+MySQL動態網站開發案例課堂
- 計算機應用基礎(Windows 7+Office 2010)