官术网_书友最值得收藏!

  • 全棧開發實戰寶典
  • 優逸客科技有限公司
  • 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 除外),不接受其他類型的值作為鍵名。

鍵名所指向的對象,不進入垃圾回收機制。

示例:

主站蜘蛛池模板: 兴业县| 岢岚县| 鄢陵县| 南投县| 衡南县| 宣汉县| 南投市| 托克托县| 纳雍县| 乐亭县| 自治县| 建德市| 福清市| 兰溪市| 广汉市| 大同县| 和平县| 甘肃省| 定西市| 三江| 晋江市| 江都市| 连云港市| 乌鲁木齐县| 沅江市| 延长县| 大余县| 莱西市| 曲松县| 德安县| 安西县| 高安市| 永靖县| 怀柔区| 余干县| 崇信县| 孟村| 渑池县| 娱乐| 灵山县| 班戈县|