JS高程讀書筆記--第五章引用類型

JS高程讀書筆記--第五章

Object類型

建立Object實例的方式有兩種。第一種是使用new操做符後跟Object構造函數,另外一種方式是使用對象字面量表示法。javascript

在經過對象字面量定義對象時,實際上不會調用Object構造函數前端

訪問對象屬性時可使用點表示法和方括號表示法。使用方括號語法時,應該要將訪問的屬性以字符串的形式放在方括號中。java

方括號表示法的優勢是能夠經過變量來訪問屬性。正則表達式

Array類型

ECMAScript數組的每一項能夠保存任何類型的數據,並它的大小是能夠動態調整的數組

建立數組

  1. 使用Array構造函數瀏覽器

  • 給構造函數傳的值是數值,則會按照該數值建立包含給定項數的數組;app

  • 若是傳遞的是其餘類型的參數,則會建立包含那個值得只有一項的數組;dom

  1. 使用數組字面量表示法函數

數組的length屬性不是隻讀的,經過設置這個屬性能夠從數組的末尾移除項或向數組中添加新項。若是將其length屬性設置爲大於數組項數的值,則新增的每一項都會取得undefined值。性能

檢測數組

  1. instanceof :value instanceof Array;它的問題在於它假定只有一個全局執行環境

  2. ES5新增了一個Array.isArray()方法

  3. constructor屬性:arr.constructor;

轉換數組

  • toString():調用數組的toString()方法會返回由數組中每一個值得字符串形式拼接而成的一個以逗號分隔的字符串;

  • valueOf():返回的仍是數組;

  • join():只接受一個參數,即用做分隔符的字符串,若是不給join()方法傳入任何值,或者給它傳入undefined,則使用逗號做爲分隔符;

若是數組中的某一項的值是null或者undefined,那麼該值在join()toLocalString()toString()方法返回的結果中以空字符串表示。

棧方法

  • push():這個方法能夠接收任何數量的參數,把它們逐個添加到數組末尾,並返回修改後數組的長度

  • pop():這個方法從數組末尾移除最後一項,減小數組的length值,而後返回溢出的項

隊列方法

  • shift():這個操做可以移除數組中的第一項返回該項

  • unshift():它能在數組前端添加任意個項並返回新數組的長度

重排序方法

  • reverse():這個方法會反轉數組項的順序;

  • sort():這個方法會調用每一個數組項的toString()轉型方法,而後比較獲得的字符串對應的ASCII值,以肯定如何排序,即便每一項都是數值;

  • sort()方法還能夠接收一個比較函數做爲參數。這個比較函數接收兩個參數,若是第一個參數應該位於第二個以前則返回一個負數,若是兩個參數相等則返回0,若是第一個參數應該位於第二個以後則返回一個整數;

reverse()sort()方法的返回值是通過排序後的數組

操做方法

  1. concat():這個方法會先建立當前數組一個副本,而後將接收到的參數添加到這個副本的末尾,而後返回新構建的數組

  • 在沒有給concat()方法傳遞參數的狀況下,它只是複製當前數組並返回副本。

  • 若是傳遞給concat()方法的是一或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。

  • 若是傳遞的值不是數組,這些值就會被簡單地添加到結果數組的末尾

  • 這個方法不會影響原數組

  1. slice():這個方法能夠接收一或兩個參數,即要返回項的起始和結束位置

  • 在只有一個參數的狀況下,slice()方法返回從該參數指定位置開始到當前數組末尾的全部項;

  • 若是有兩個參數,該方法返回起始和結束位置以前的項,但不包括結束位置的項

  • 這個方法不會影響原數組

  1. splice():這個方法算是最強大的數組方法,主要用途是向數組的中部插入項。這個方法會影響原數組,它始終都會返回一個數組,該數組中包含從原始數組中刪除的項

  • 刪除:能夠刪除任意數量的項,只需指定2個參數:要刪除的第一項的位置要刪除的項數

  • 插入:能夠向指定位置插入任意數量的項,只需提供3個參數:起始位置0(要刪除的項數)要插入的項。若是要插入多個項,能夠再傳入第4、第五,以致任意多個項;

  • 替換:能夠向指定位置插入任意數量的項,且同時刪除任意數量的項,只需指定3個參數:起始位置要刪除的項數和要插入的任意數量的項。插入的項沒必要與刪除的項相等;

位置方法

ES5爲數組實例添加了兩個位置方法:indexOf()lastIndexOf()。這兩個方法都接收兩個參數:要查找的項和(可選)表示查找起點位置的索引。其中indexOf()方法從數組的開頭(位置0)開始查找,lastIndexOf()方法則從數組的末尾開始向前查找。

這兩個方法都返回要查找的項在數組中的位置,或者在沒找到的狀況下返回-1

迭代方法

ES5爲數組定義了5個迭代方法。每一個方法都接受兩個參數:要在每一項上運行的函數和(可選)運行該函數的做用域對象--影響this的值。傳入這些方法中的函數會接收三個參數:數組項的值(item)該項在數組中的位置(index)、和數組自己對象(array),如下方法都不會修改數組中的包含的值。

  • every():對數組中的每一項運行給定函數,若是該函數對每一項都返回true,則返回true;

  • filter():對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組

  • forEach():對數組中的每一項運行給定的函數。這個方法沒有返回值,本質上和for循環同樣;

  • map(): 對數組中的每一項運行給定的函數,返回每次函數調用的結果組成的數組;

  • some():對數組中的每一項運行給定函數,若是該函數對任一項返回true,則返回true。

歸併方法

  1. ES5新增了兩個歸併數組的方法:reduce()reduceRight()。這兩個方法都會迭代數組的全部項,而後構建一個最終返回的值。其中,reduce()方法從數組的第一項開始,逐個遍歷到最後。而reduceRight()則從數組的最後一項開始,向前遍歷到第一項。

  2. 這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選)做爲歸併基礎的初始值

  3. 傳入給reduce()reduceRight()的函數接收4個參數:前一個值、當前值、項的索引和數組對象。

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
    return prev+cur;
});
console.log(sum);    // 15

Date類型

  1. 要建立一個日期對象,使用new操做符和Date構造函數便可;

  2. Date.parse()方法接受一個表示日期的字符串參數,而後嘗試根據這個字符串返回相應日期的毫秒數,若是直接將表示日期的字符串傳遞給Date構造函數,也會在後臺調用Date.parse()

  3. Date類型也重寫了toLocaleString()toString()valueOf()方法:

  • toLocaleString()會按照與瀏覽器設置的地區相適應的格式返回日期和時間;

  • toString()方法則一般返回帶有時區信息的日期和時間;

  • valueof()方法根本不返回字符串,而是返回日期的毫秒錶示;

RegExp類型

  1. ECMAScript經過RegExp類型來支持正則表達式。每一個正則表達式均可帶有一個或多個標誌,用以代表正則表達式的行爲:

  • g:表示全局模式,即模式將被應用於全部字符串,而非在發現第一個匹配項時當即中止;

  • i:表示不區分大小寫模式,即在肯定匹配項時忽略模式與字符串的大小寫;

  • m:表示多行模式,即在到達一行文本末尾時還會繼續查找下一行中是否存在於模式匹配的項

  1. 模式中全部的元字符都必須轉義:( [ ^ $ | ) ? * + . ] } )

  2. 可使用RegExp構造函數,它接收兩個參數:一個是要匹配的字符串模式,另外一個是可選的標誌字符串

  3. RegExp對象的主要方法是exec(),該方法專門爲捕獲組而設計的

  • exec()接收一個參數,即要應用模式的字符串,而後返回包含第一個匹配項信息的數組;或者在沒有匹配項信息的狀況下返回null

  • 返回的數組雖然是Array實例,但也包含兩個額外的屬性:index和input。其中,index表示匹配項在字符串中的位置,而input表示應用正則表達式的字符串;

  • 在數組中,第一項是與整個模式匹配的字符串,其餘項是與模式中的捕獲組匹配的字符串(若是模式中沒有捕獲組,則該數組只包含一項);

  • 即便在模式中設置了全局標誌g,它每次也只會返回一個匹配項。在不設置全局標誌的狀況下,在同一個字符串上屢次調用exec()將始終返回第一個匹配項的信息。而在設置全局標誌的狀況下,每次調用exec()則都會在字符串中繼續查找新匹配項。

  1. 正則表達式的第二個方法是test(),它接收一個字符串參數。在模式與該參數匹配的狀況下返回true;不然返回false。它常常被用於if語句

Function類型

函數其實是對象,每一個函數都是Function類型的實例,並且都與其餘引用類型同樣具備屬性和方法。因爲函數是對象,所以函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。

函數定義

函數一般是使用函數聲明語法定義的:

function sum(num1,num2){
    return num1 + num2;
}

與使用函數表達式定義函數的方式幾乎相差無幾

var sum = function (num1,num2){
    return num1 + num2;
};

解析器會率先讀取函數聲明,並使其在執行任何代碼以前可用(能夠訪問);至於函數表達式,則必須等到解析器執行到它所在的代碼行,纔會真正被解釋執行。

最後一種函數定義的方式是使用Function構造函數。Function構造函數能夠接收任意數量的參數,但最後一個參數始終都被當作是函數體,而前面的參數則枚舉出了新函數的參數

var sum = new Function("num1","num2","return num1 + num2"); // 不推薦

從技術角度講,這是一個函數表達式。可是,咱們不推薦使用這種方式來定義函數,由於這種語法會致使解析兩次代碼(第一次是解析常規ECMAScript代碼,第二次是解析傳入構造函數中的字符串),從而影響性能。

注:使用不帶圓括號的函數名是訪問函數指針,而非調用函數

由於ECMAScript中的函數名自己就是變量,因此函數也能夠做爲來使用。

函數內部屬性

在函數內部,有兩個特殊的對象:arguments和this。其中arguments是一個類數組對象,包含着傳入函數中的全部參數。this引用的是函數據以執行的環境對象--或者也能夠說是this值(當在網頁的全局做用域中調用函數時,this對象引用的就是window)

callee

雖然arguments的主要用途是保存函數參數,但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數

function rec(num){
    if(num<=1){
        return 1;
    }else{
        return num * arguments.callee(num-1)
    }
}

當函數在嚴格模式下運行時,訪問arguments.callee會致使錯誤

caller

這個屬性中保存着調用當前函數的函數的引用,若是實在全局做用域中調用當前函數,它的值爲null。

  • 在嚴格模式下訪問arguments.caller屬性也會致使錯誤,而在非嚴格模式下這個屬性始終是undefined

  • 嚴格模式下不能爲函數的caller屬性賦值,不然會致使錯誤

函數的屬性和方法

ECMAScript中的函數是對象,所以函數也有屬性和方法

屬性

每一個函數都包含兩個屬性:length和prototype

  • length屬性表示函數但願接收的命名參數的個數

  • prototype是保存它們全部實例方法的真正所在。prototype屬性是不可枚舉的,所以使用for-in沒法實現;

方法

每一個函數都包含兩個非繼承而來的方法:apply()call()。這兩個方法的用途都是在特定的做用域中調用函數,實際上等於設置函數體內this對象的值

  • apply()方法接收兩個參數:一個是在其中運行函數的做用域,另外一個是參數數組。其中第二個參數能夠是Array的實例,也能夠是arguments對象。

  • call()方法與apply()方法的做用相同,它們的區別僅在於接收參數的方式不一樣,傳遞給函數的參數必須逐個列舉出來;

  • ES5定義了bind()方法會建立個函數的實例,其this值會被綁定到傳給bind()函數的值;

call()apply()真正強大的地方是可以擴充函數賴以運行的做用域,最大的好處就是對象不須要與方法有任何耦合關係。

基本包裝類型

每當讀取一個基本類型值得時候,後臺就會建立一個對應的基本包裝類型的對象,從而讓咱們可以調用一些方法來操做這些數據。

  1. 引用類型和基本包裝類型的主要區別就是對象的生存期

  • 使用new操做符建立的引用類型的實例,在執行流離開當前做用域以前都一直保存在內存中;

  • 自動建立的基本包裝類型的對象,只存在於一行代碼的執行瞬間,而後當即被銷燬,這意味着咱們不能在運行的時候爲基本類型值添加屬性和方法;

  1. 能夠顯式的調用Boolean、Number和String來建立基本包裝類型的對象

  • 這種作法很容易分不清處理基本類型仍是引用類型。對基本包裝類型的實例調用typeof會返回"object",並且全部基本包裝類型的對象都會被轉換爲布爾值true;

  • 使用new調用基本包裝類型的構造函數,與直接調用同名的轉型函數是不同的;

Boolean類型

  1. Boolean類型的實例重寫了valueOf()方法,返回基本類型值true或false;重寫了toString()方法,返回字符串"true"和"false";

  2. 使用instanceof()操做符測試Boolean對象會返回true;

  3. 布爾表達式中的全部對象都會被轉換爲true;

建議永遠都不要使用Boolean對象

Number類型

  • valueOf():返回對象表示的基本類型的數值;

  • toString():返回字符串形式的數值,能夠爲其傳遞一個表示基數的參數,告訴它返回幾進制數值的字符串形式;

  • toFixed():會按照指定的小數位返回數值的字符串表示,這個方法很適合處理貨幣值

  • toExponential():該方法返回以指數表示法(也稱e表示法)表示的數值的字符串形式;

  • toPrecision():這個方法會根據要處理的數值決定究竟是調用toFixed()仍是toExponential(),這三個方法均可以經過向上向下舍入,作到以最準確的形式來表示帶有正確小數位的值。這個方法接收一個參數,即表示數值的全部數字的位數(不包括指數部分)

String類型

String類型的每個實例都有一個length屬性,表示字符串中包含多少個字符。即便字符串中包含雙字節字符(不是佔一個字節的ASCII字符),每一個字符也仍然算一個字符。

字符方法

兩個用於訪問字符串中特定字符的方法是:charAt()charCodeAt()。這兩個方法都接收一個參數,即基於0的字符位置

  • charAt():這個方法以單字符串的形式返回給定位置的那個字符;

  • charCodeAt():這個方法以字符編碼的形式返回給定位置的那個字符;

  • ES5中還定義了,可使用方括號加數字索引([1])來訪問字符串中特定位置;

字符串操做方法

  • concat():用於將一個或多個字符串拼接起來,返回拼接獲得的新字符串,它不會影響原字符串

  • ES還提供了3個基於子字符串建立新字符串的方法:slice()substr()substring()

  1. 這三個方法都會返回被操做字符串的一個子字符串,並且也都接受一或兩個參數,第一個參數指定字符串的開始位置

  2. slice()substring()的第二個參數指定的是子字符串最後一個字符後面的位置

  3. substr()的第二個參數指定的是返回的字符個數

  4. 這三個方法都不會影響原字符串

  5. 在給這些方法傳遞負值的狀況下,slice()方法會將傳入的負值與字符串的長度相加,substr()方法將負的第一個參數加上字符串的長度,而將第二個參數轉換爲0,substring()方法會把全部負值參數都轉換爲0;

字符串位置方法

有兩個能夠從字符串中查找子字符串的方法:indexOf()lastIndexOf()。這兩個方法都是從一個字符串中搜索給定的子字符串,而後返子字符串的位置(若是沒有找到該子字符串,則返回-1

  • indexOf()方法從字符串的開頭向後搜索子字符串,而lastIndexOf()方法是從字符串的末尾向前搜索子字符串;

  • 這兩個方法均可以接收第二個參數,表示從字符串中的哪一個位置開始搜索;

trim()

ES5爲全部字符串定義了trim()方法。這個方法會建立一個字符串的副本,刪除前置及後綴的全部空格,而後返回結果。
因爲trim()返回的是字符串的副本,因此不影響原始字符串

字符串大小寫轉換方法

ECMAScript設計大小寫轉換的方法有四個toLowerCasetoLocaleLowerCase()toUpperCase()toLacleUpperCase()。其中toLowerCasetoUpperCase()是兩個經典方法,而toLocaleLowerCase()toLacleUpperCase()方法則是針對特定地區的實現。

字符串的模式匹配方法

  1. match():在字符串上調用這個方法本質上與調用RegExp的exec()的方法相同。它只接受一個參數,要麼是一個正則表達式,要麼是一個RegExp對象;

  2. search():這個方法的惟一參數與match()方法的參數相同。這個方法返回字符串中第一個匹配項的索引,若是沒有找到匹配項則返回-1,並且search()方法始終是從字符串開通向後查找模式;

  3. replace():這個方法接收兩個參數,第一個參數能夠是一個RegExp對象或者一個字符串(這個字符串不會被轉換成正則表達式),第二個參數能夠是一個字符串或者一個函數

  • 若是第一個參數是字符串,那麼只會替換第一個子字符串,想要替換全部的子字符串惟一的方法就是提供一個正則表達式,並且要指定全局(g)標誌;

  • 這個方法的第二個參數也可使一個函數。在只有一個匹配項的狀況下,會向這個函數傳遞3個參數:模式的匹配項、模式匹配項在字符串中的位置和原始字符串;

  • 這個方法不會影響原字符串;

  1. split():這個方法能夠基於指定的分隔符將一個字符串分割成多個子字符串,並將結果放在一個數組中,分隔符能夠是字符串,也能夠是一個RegExp對象。split()方法能夠接受可選的第二個參數,用於指定數組的大小,以便確保返回的數組不會超過既定大小。

localeCompare()

這個方法比較兩個字符串,並返回下列值中的一個:

  • 若是字符串在字母表中應該排在字符串參數以前,則返回一個負數(大多狀況下是-1);

  • 若是字符串等於字符串參數,則返回0;

  • 若是字符串在字母表中應該排在字符串參數以後,則返回一個正數(大多狀況下是1);

formCharCode()

String構造函數自己還有一個靜態方法:fromCharCode()。這個方法的任務是接收一或多個字符編碼,而後將它們轉換成一個字符串。

單體內置對象

由ECMAScript實現提供的,不依賴於宿主環境的對象,這些對象在ECMAScript程序執行以前就已經存在了

Global對象

全部在全局做用域中定義的屬性和函數,都是Global對象的屬性。

URI編碼

Global對象的encodeURI()encodeURIComponent()方法能夠對URI進行編碼,以便發送給瀏覽器

  • encodeURI()主要用於整個URI,而encodeURIComponent()主要用於對URI中的某一段進行編碼;

  • 它們的主要區別在於,encodeURI()不會對自己屬於URI的特殊字符進行編碼,例如冒號、正斜槓、問號和井字號;而encodeURIComponent()則會對它發現的任何非標準字符進行編碼;

  • decodeURI()只能對使用encodeURI()替換的字符進行解碼,一樣的decodeURIComponent()可以解碼使用encodeURIComponent()編碼的全部字符,即它能夠解碼任何特殊字符的編碼;

eval()方法

這個方法就像一個完整的ECMAScript解析器。

  • 它只接收一個參數,即要執行的ECMAScript字符串;

  • 經過eval()執行的代碼被認爲是包含該次調用的執行環境的一部分,所以被執行的代碼具備與該執行環境相同的做用域鏈;

  • eval()中建立的任何變量都不會被提高

嚴格模式下,在外部訪問不到eval()中建立的任何變量或函數

Global對象的屬性

  • 特殊的值undefined、NaN以及Infinity都是Global對象的屬性;

  • 全部原生引用類型的構造函數,也都是Global對象的屬性;

  • ES5明確禁止給undefined、NaN和Infinity賦值,這樣作即便在非嚴格模式下也會致使錯誤;

window對象

Web瀏覽器將這個全局對象做爲window對象的一部分加以實現。在全局做用域中聲明的全部變量和函數,就都成爲了window對象的屬性。

在沒有給函數明確指定this值的狀況下,this值等於Global對象

Math對象

ECMAScript還爲保存數學公式和信息提供了一個公共位置,即Math對象

min()max()

這兩個方法用於肯定一組數值中的最小值和最大值。這兩個方法均可以接受人一多個數值參數;

要找到數組中的最大最小值,可使用:Math.max.apply(Math,arr)

舍入方法

  • Math.ceil()執行向上攝入,即它老是將數值向上舍入爲最接近的整數;

  • Math.floor()執行向下舍入,即它老是將數值向下舍入爲最接近的整數;

  • Math.round()執行標準舍入,即它老是將數值四捨五入爲最接近的整數;

random()方法

Math.random()方法返回大於等於0小於1的一個隨機數

能夠利用這個方法從某個整數範圍內隨機選擇一個值
值 = Math.floor(Math.random() * 可能值的總數 + 第一個可能的值)

相關文章
相關標籤/搜索