JavaScript高級程序設計(第3版)第五章讀書筆記

第五章 引用類型前端

  1. 建立Object實例的方式有兩種,第一種是使用new操做符後跟Object構造函數,例如:

var person = new Object( );正則表達式

person.name = 「Nicholas」;express

person.age=29;數組

第二種是使用對象字面量表示法。如:瀏覽器

var person = {數據結構

name : 「Nicholas」,app

age : 29dom

};函數

在最後一個屬性後面添加逗號,會在IE7及更早版本和Opera中致使錯誤。this

  1. 兩種訪問對象屬性的方法,一是方括號語法,例如person[「name」],而另外一種是點表示法,例如person.name。方括號語法的主要優勢是能夠經過變量來訪問屬性。若是屬性名中包含會致使語法錯誤的字符(屬性名中包含非字母非數字的),或者屬性名使用的是關鍵字或保留字,也可使用方括號表示法。一般,更建議用點表示法。
  2. 不一樣於其餘語言,ECMAScript數組的每一項能夠保存任何類型的數據,並且ECMAScript數組的大小是能夠動態調整的,便可以隨着數據的添加自動增加以容納新增數據。
  3. 建立數組的基本方式有兩種:一是使用Array構造函數,如 var colors = new Array( );第二種方式是使用數組字面量表示法。如 var colors = [「red」, 「blue」, 「green」];不要以逗號結尾,以避免產生混淆。如 var values = [1,2,] ,會建立一個包含2或3項的數組。
  4. 數組的length屬性不是隻讀的,能夠自定義,便可以從數組的末尾移除項或向數組中添加新項。
  5. 對於一個網頁,或者一個全局做用域而言,使用instanceof操做符就能獲得滿意的結果。但instanceof操做符的問題在於,它假定只有一個全局執行環境。所以,ECMAScript5新增了Array.isArray( )方法。此方法的目的是最終肯定某個值究竟是不是數組,而無論它是在哪一個全局執行環境中建立的。支持Array.isArray( )方法的瀏覽器有IE9+、Firefox4+、Safari5+、Opera10.5+和Chrome。
  6. 全部數組對象都具備toLocaleString( )、toString( )和valueOf( )方法。其中調用數組的toString( )方法會返回由數組中每一個值的字符串形式拼接而成的一個以逗號分隔的字符串。而valueO( )返回的仍是數組。注意:alert()接收字符串參數,因此它會在後臺調用toString( )方法。
  7. join( )方法可使用不一樣的分隔符來構建這個字符串。Join( )方法只接收一個參數,即用做分隔符的字符串,而後返回包含全部數組項的字符串。

如 var colors = [「yellow」,」red」,」green」];

   alert(colors.join(「|」));   //yellow|red|green

若是不給join( )方法傳入任何值,或者給它傳入undefined,則使用逗號做爲分隔符。IE7及更早版本會錯誤的使用字符串「undefined」做爲分隔符。

  1. 數組的棧方法(後進先出)的數據結構。push( )方法能夠接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改後數組的長度。而pop( )方法則從數組末尾移除最後一項,減小數組的length值,而後返回移除的項。
  2. 數組的隊列方法(先進先出)。隊列在列表的末端添加項,從列表的前端移除項。仍然使用push( )向數組末端添加項,使用shift( )從數組前端取得第一項並返回該項,同時將數組長度減1。Unshift( )方法與shift( )的用途相反,它能在數組前端添加任意個項並返回新數組的長度。
  3. 數組的兩個重排序方法:reverse( )方法會翻轉數組想的順序,sort( )按升序排列數組項,sort( )方法會調用每一個數組項的toString( )轉型方法,而後比較獲得的字符串,以肯定如何排序。所以,sort( )方法能夠接收一個比較函數做爲參數,以便指定哪一個值位於哪一個值的前面。
  4. 數組的concat( )方法能夠基於當前數組中的全部建立的一個新數組,建立當前數組的一個副本,而後將接收到到的參數添加到這個副本的末尾。

var colors = ["red", "green", "blue"];

var colors2 = colors.concat("yellow",["black","brown"]);

colors    //["red", "green", "blue"]

colors2   //["red", "green", "blue", "yellow", "black", "brown"]

  1. 數組的slice( )方法,基於當前數組中的一或多個項建立一個新數組。接收一個到兩個參數,即返回項的起始和結束爲止,但不返回結束位置的項。

 var colors3=colors2.slice(1);     //["green", "blue", "yellow", "black", "brown"]

var colors4 = colors2.slice(1,4);   // ["green", "blue", "yellow"]

slice()方法的參數中有一個附屬,則用數組長度加上該數來肯定相應的位置。

var colors5 = colors2.slice(-2,-1);  // ["black"] 

  1. 數組的splice( )方法是最強大的數組方法,主要用途是向數組的中部插入項。

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

插入:能夠向指定位置插入任意數量的項,需指定3個參數:起始位置、0(要刪除的項數)、要插入的項數。

替換:能夠向指定位置插入任意數量的項,且同時刪除任意數量的項,需指定3個參數:起始位置,要刪除的項數、要插入的任意數量的項。

Splice( )方法始終都會返回一個數組,該數組中包含從原始數組中刪除的項(若是沒有刪除任何項,則範湖一個空數組)。

var colors = ["red","green","blue"];

var removed = colors.splice(0,2);

colors     //["blue"]

removed   //["red", "green"]

 

removed = colors.splice(0,0,"yellow","orange");   //[]

colors                                    //["yellow", "orange", "blue"]

 

removed = colors.splice(1,3,"red","pink");   //["orange", "blue", "yellow"]

colors                                //["yellow", "red", "pink", "orange"]

 

var colors = ["yellow", "orange", "blue"];

removed = colors.splice(1,2,"red","pink");   //["orange", "blue"]

colors                                //["yellow", "red", "pink"]

  1. 數組位置查找方法:indexOf( )和lastIndexOf( )。這兩個方法都接收兩個參數:要查找的項和(可選的)表示查找起點位置的索引。成功則返回查找的項在數組中的第一次出現的位置,不然返回-1.在比較過程當中,將使用全等操做符。

var numbers = [1,2,3,4,5,4,3,2,1];

numbers.indexOf(4);  //3

numbers.indexOf("4");  //-1

numbers.lastIndexOf("4");  //-1

numbers.lastIndexOf(4);   //5

numbers.indexOf(4,4);    //從起始位置向後找

numbers.lastIndexOf(4,4)  //3 從起始位置向前找

numbers.lastIndexOf(4,5)  //5從起始位置向前找

 

var person ={name:"Nicholas"};

var people=[{name:"Nicholas"}];

var morePeople = [person];

people.indexOf(person);   //-1

morePeople.indexOf(person);  //0

  1. ECMAScript 5爲數組定義了5個迭代方法。每一個方法要接收兩個參數:要在每一項上運行的函數和(可選的)運行該函數的做用域對象——影響this的值。傳入這些方法中的函數會接收三個參數:數組項的值、該項在數組中的位置和數組對象自己。

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

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

forEach( ):對數組中的每一項運行給定函數,無返回值;

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

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

以上方法都不會修改數組中的包含的值。

  1. 數組歸併方法:reduce( )和reduceRight( )。這兩個方法都會迭代數組的全部項,而後構建一個最終返回的值。reduce( )方法從數組的第一項開始,逐個遍歷到最後,而reduceRight( )則從數組的最後一項開始,向前遍歷到第一項。
  2. Date類型,建立方法: var now = new Date( );

Date.parse( )方法接收一個表示日期的字符串參數,而後嘗試根據這個字符串返回相應日期的毫秒數。若是該字符串不能表示日期,則會返回NaN。

Date.UTC( )返回日期的毫秒數,但與Date.parse( )在構建時使用不一樣的信息。

ECMAScript 5添加了Date.now( )方法,返回表示調用這個方法時的日期和時間的毫秒數。

  1. Date類型的toLocaleString( )和toString( )方法,返回的日期格式不一樣,valueOf( )方法,返回日期的毫秒錶示。
  2. 日期格式化方法:

toDateString( )——以特定於實現的格式顯示星期幾、月、日和年;

toTimeString( )——以特定於實現的格式顯示時、分、秒和時區;

toLocaleDateString( )——以特定於地區的格式顯示星期幾、月、日和年;

toLocaleTimeString( )——以特定於實現的格式顯示時、分、秒;

toUTCString( )——以特定於實現的格式完整的UTC日期。

沒有一個方法可以用來在用戶界面中顯示一致的日期信息。

  1. 日期/時間組件方法,見書102頁。
  2. RegExp類型,字面量形式語法爲: var expression = /pattern/ flag; 模式(pattern)部分能夠是任何簡單或複雜的正則表達式,能夠包含字符類、限定符、分組、向前查找以及反向引用。每一個正則表達式均可帶有一或多個標誌(flags),用以標明正則表達式的行爲。

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

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

m:表示多行模式,即在到達一行文本末尾時還未繼續查找下一行中,是否存在於模式匹配的項。記住:不往前找。

模式中使用的全部元字符都必須轉義,正則表達式中的元字符包括:

( [ { \ ^ $ | } ? * + . ] }

使用RegExp構造函數建立正則表達式,兩個參數:一個是要匹配的字符串模式,一個是可選的標誌字符串。這兩個參數都是字符串!

使用正則表達式字面量和使用RegExp構造函數建立的正則表達式不同。在ECMAScript 3中,正則表達式字面量始終會共享同一個RegExp實例,而使用構造函數建立的每個新RegExp實例都是一個新實例。但在ECMAScript5中,二者都會建立新的RegExp實例。

  1. RegExp實例屬性:

global:布爾值,表示是否設置了g標誌;

ignoreCase: 布爾值,表示是否設置了i標誌;

lastIndex : 整數,表示開始搜索下一個匹配項的字符位置,從0算起;

multiline: 布爾值,表示是否設置了m標誌;

source:正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。

  1. RegExp實例方法:

主要方法是exec( ),該方法是專門爲捕獲組而設計的。exec( )接收一個參數,即要應用模式的字符串,而後返回包含第一個匹配項信息的數組,若無匹配項,則返回null。返回的數組是Array的實例,但包含兩個額外的屬性:index和input。對於exec( )方法而言,不設置全局標誌的狀況下,在同一個字符串中屢次調用exec( )將始終返回第一個匹配項的信息,而在設置全局標誌的狀況下,每次調用exec( )則都會在字符串中繼續查找新匹配項。

test( )方法接收一個字符串參數,在模式與該參數匹配的狀況下返回true,不然返回false。

正則表達式的valueOf( )方法返回正則表達式自己。

  1. 使用函數表達式定義函數時,function關鍵字後面沒有函數名,且函數末尾必須有分號。函數名僅僅是指向函數的指針,所以一個函數可能會有多個名字。注意,使用不帶圓括號的函數名是訪問函數指針,而非調用函數。
  2. 函數聲明和函數表達式的區別:解析器會先解析函數聲明,並使其在執行任何代碼以前可用(能夠訪問);至於函數表達式,則必須等到解析器執行到它所在的代碼航,纔會真正被解釋執行。
  3. 函數內部,兩個特殊的對象:arguments和this。arguments的主要用途是保存函數參數,但它還有個名爲callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。this對象引用的是函數據以執行的環境對象。ECMASCript5中定義了另外一個函數對象的屬性:caller。這個屬性中保存着調用當前函數的函數的引用。嚴格模式下,訪問arguments.caller屬性會致使錯誤,另外不能爲函數的caller屬性賦值,不然會致使錯誤。
  4. 每一個函數都包含兩個屬性:length和prototype,其中,length屬性表示函數但願接收的命名參數的個數。對於ECMAScript中的引用各種型而言,protorype是保存它們全部實例方法的真正所在。在ECMAScript5中,prototype屬性石不可枚舉的,所以使用for-in沒法發現。
  5. 每一個函數都包含兩個非繼承而來的方法:apply( )和call()。這兩個方法的用途都是在特定的做用域中調用函數,實際上等於設置函數體內this對象的值。

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

call( )方法與apply( )方法的做用個相同,它們的區別僅在於接收參數的方式不一樣。對於call( )方法而言,第一個參數是this值沒有變化,變化的是其他參數都直接傳遞給函數。換句話說,在使用call( )時,傳遞給函數的參數必須逐個列舉出來。

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

ECMAScript 5 還定義了一個方法:bind( )。這個方法會建立一個函數的實例,其this值會被綁定到傳給bind( )函數的值。

  1. 3個特殊的引用類型:Boolean、Number和String。引用類型有基本包裝類型的主要區別就是對象的生存期。使用new操做符建立的引用類型的實例,在執行流離開當前做用域以前都一直被保存在內存中個,而自動建立的基本包裝類型的對象,則值存在於一行代碼的執行瞬間。對基本包裝類型的實例調用typeof會返回」object」,並且全部基本包裝類型的對象都會被轉換成布爾值true。注意:使用new調用基本包裝類型的構造函數,與直接調用同名的轉型函數時不同的(見書119頁示例)。
  2. Number類型提供了將數值格式化爲字符串的方法:toFix( ),會按照指定的小數位返回數值的字符串表示,且有四捨五入規則。用於格式化數值的方法是toExponential( ),該方法返回以指定表示法(e表示法)表示的數值的字符串形式,接收參數,指定輸出結果中的小數位數。對於一個數值而言,toPrecision( )方法可能會返回固定大小(fixed)格式,或者指數格式,此方法也接收一個參數,即表示數值的全部數字位數(不包括指數部分)。這三個方法均可以經過向上或向下舍入,作到以最準確的形式來表示帶有正確小數位的值。
  3. String類型的方法
    1. 字符方法 charAt( )和charCodeAt( ),都接收一個參數,即基於0的字符位置。一份返回指定位置的字符,另外一個返回指定位置字符的字符編碼;
    2. 字符串操做方式: concat( ),用於將一或多個字符串拼接起來,返回拼接獲得的新字符串。

 

slice( )

substring( )

substr( )

第一個參數

指定字符串的開始位置

第二個參數

指定子字符串最後一個字符後面的位置,若無則到結尾

指定返回字符的個數,若無則到結尾

是否修改字符串自己的值

參數爲負值

將傳入的負值與字符串的長度想家

把全部的負值參數轉換爲0

將負的第一個參數加上字符串的長度,將負的第二參數轉換爲0

           
  1. 字符串的位置方法:

 

indexOf( )

lastIndexOf( )

功能

從一個字符串中搜索給定的字符串,而後返字符串的位置,若是沒有找到,則返回-1

區別

從字符串的開頭向後搜索子字符串

從字符串的末尾向前搜索子字符串

  1. trim( )方法,ECMAScript5中定義,此方法會建立一個字符串的副本,刪除前置及後綴的全部空格,而後返回結果,不影響原字符串。
  2. 字符串大小寫轉換方法:toLowerCase( )、toLocaleCase( )、toUpperCase( )和toLocaleUpperCase( )。
  3. 字符串的模式匹配方法

match( )方法只接受一個參數,要麼是一個正則表達式,要麼是一個RegExp對象。返回一個數組,數組的第一項是與整個模式匹配的字符串,以後的每一項(若是有)保存着與正則表達式中的捕獲組匹配的字符串。

search( )方法只接收一個參數,要麼是一個正則表達式,要麼是一個RegExp對象。返回字符串中第一個匹配項的索引,若無匹配項,則返回-1.該方法始終是從字符串開頭向後查找模式。

replace( )方法接受兩個參數:第一個參數能夠是一個RegExp對象或者一個字符串(這個字符串不會被轉換成正則表達式),第二個參數能夠是一個字符串或者一個函數,此時函數接受3個參數:模式的匹配項、模式匹配項在字符串中的位置和原始字符串。

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

  1. localeCompare( )方法比較兩個字符串,並返回下列值中的而一個:

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

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

若是字符串在字母表中應該排在字符串參數以後,則返回一個整數(大多數狀況下是1,視狀況而定)。

  1. fromCharCode( )方法,是String構造函數自己的靜態方法,接受一或多個字符編碼,而後將它們轉換成一個字符串。從本質上看,此方法與實例方法charCodeAt( )執行的是相反的操做。
  2. 兩大單體內置對象:Global和Math

    Global(全局)對象,不屬於任何其餘對象的屬性和方法,最終都是它的屬性和方法。Global對象的encodeURI( )和encodeURIComponent( )方法能夠對URI( Uniform Resource Identifiers,通用資源標識符)進行編碼,以便發給瀏覽器。其中,encodeURI( )主要用於整個URI,而encodeURIComponent( )主要用於對URI中的某一段進行編碼。區別在於,encodeURI( )不會對自己屬於URI的特殊字符進行編碼,例如冒號、正斜槓、問號和井字號,而encodeURIComponent( )則會對它發現的任何非標準字符進行編碼。encodeURI( )和encodeURIComponent( )對應的兩個方法分別是decodeURI( )和decodeURIComponent( ),其中decodeURI( )只能對使用encodeURI( )替換的字符進行解碼,同理,decodeURIComponent( )只能替換encodeURIComponent( )編碼,便可以解碼任何特殊字符的編碼。

        eval( )方法是ECMAScript語言中最強大的一個方法,就像一個完整的ECMAScript解析器,它只接收一個參數,即要執行的ECMAScript(或JavaScript)字符串。嚴格模式下,在外部訪問不到eval( )中建立的任何變量或函數。

        Math對象的屬性見書134頁。

        Math對象的min( )和max( )方法。可接收任意多個數值參數。

        舍入方法:Math.ceil( )向上舍入成最接近的整數;Math.floor( )向下舍入爲最接近的整數,Math.round( )執行標準舍入,四捨五入爲最接近的整數。

        Random( )方法返回大於等於0小於1的一個隨機數。

相關文章
相關標籤/搜索