javascript高等程序設計(第三版)進修摘錄上

把近期看高程這本書做的筆記摘錄整理出來了,總歸對原生javascript理論有了一個比較周全的的熟悉,此次把書中的一些學問要點摘錄出來了,便於今后查閱的時刻有方向,也更有效力!!

第一章、javascript簡介

  • 0101、完整的javascript有三部份構成:中心ECMAScript,DOM和BOM
  • 0102、ECMAScript劃定了言語的以下構成部份:語法,範例,語句,關鍵字,保留字,操縱符,對象

第二章、在html中運用javascript

  • 0201、HTML4.01為script定義了以下6個屬性:async:可選,示意馬上下載劇本,不壅塞;charset:可選,指定字符集;defer:可選,延晚到文檔完整被剖析和顯現以後再實行;language:已燒毀;src:可選,包含要實行代碼的外部文件;type:可選,劇本言語的內容範例
  • 0202、標籤的位置:一切script元素都應當放在頁面的<body>元素頁面內容的背面
  • 0203、IE8今後不支撐defer屬性
  • 0204、async屬性的目的是不讓頁面守候劇本下載和實行,從而異步加載頁面其他內容
  • 0205、<小於號在XHTML中會被算作最先一個新標籤來剖析
  • 0206、noscript包含該元素的內容只需在以下狀況才會顯現出來:不支撐劇本,支撐劇本但被禁用

第三章、基本觀點

  • 0301、標識符,就是指變量、函數、屬性的名字,或許函數的參數:第一個字符必須是一個字母、下劃線( _ )或一個美圓標記( $ );

其他字符可所以字母、下劃線、美圓標記或数字

  • 0302、嚴厲情勢下,ECMAScript 3 中的一些不肯定的行動將取得處置懲罰,而且對某些不平安的操縱也會拋出毛病。在函數內部的上方包含這條編譯指導,也可以指定函數在嚴厲情勢下實行
  • 0303、加上這個分號可以防止很多毛病,加上分號也會在某些狀況下增長代碼的機能,因為如許剖析器就沒必要再花時候推想應當在那裡插進去分號了
  • 0304、用 var 操縱符定義的變量將成為定義該變量的作用域中的局部變量。也就是說,如果在函數中運用 var 定義一個變量,那末這個變量在函數退出后就會被燒毀。雖然省略 var 操縱符可以定義全局變量,但這也不是我們引薦的做法。給未經聲明的變量賦值在嚴厲情勢下會致使拋出 ReferenceError 毛病
  • 0305、ECMAScript 中有 5 種簡樸數據範例(也稱為基本數據範例):Undefined 、Null、Boolean 、Number和 String 。另有 1種龐雜數據範例—— Object , Object 本質上是由一組無序的名值對構成的
  • 0306、Safari 5 及之前版本、Chrome 7 及之前版本在對正則表達式挪用 typeof 操縱符時會返回 “function” ,而其他瀏覽器在這類狀況下會返回”object”
  • 0307、對未經聲明的變量挪用 delete 不會致使毛病,但如許做沒什麼現實意義,而且在嚴厲情勢下確切會致使毛病
  • 0308、對未初始化和未聲明的變量實行 typeof 操縱符都返回了 undefined 值;這個效果有其邏輯上的合理性。因為雖然這兩種變量從手藝角度看有本質區分,但現實上不論對哪一種變量也不能夠實行真正的操縱
  • 0309、如果定義的變量預備在未來用於保留對象,那末最好將該變量初始化為 null 而不是其他值。只需意在保留對象的變量還沒有真正保留對象,就應當明白地讓該變量保留null值。如許做不僅可以表現 null 作為空對象指針的通例,而且也有助於進一步辨別null和undefined
  • 0310、要將一個值轉換為其對應的 Boolean 值,可以挪用轉型函數 Boolean()
  • 0311、八進制字面值的第一位必須是零(0),然後是八進制数字序列(0~7)。如果字面值中的數值超出了局限,那末前導零將被疏忽,背面的數值將被算作十進制數值剖析
  • 0312、十六進制字面值的前兩位必須是 0x,後跟任何十六進制数字(0~9 及 A~F)。个中,字母 A~F可以大寫,也可以小寫
  • 0313、保留浮點數值需要的內存空間是保留整數值的兩倍,因此 ECMAScript會不失時機地將浮點數值轉換為整數值
  • 0314、在默許狀況下,ECMASctipt 會將那些小數點背面帶有 6 個零以上的浮點數值轉換為以 e 示意法示意的數值(比方,0.0000003 會被轉換成 3e-7)
  • 0315、浮點數值的最高精度是 17 位小數,但在舉行算術盤算時其準確度遠遠不如整數。比方,0.1 加 0.2的效果不是 0.3,而是 0.30000000000000004。這個小小的舍入偏差會致使沒法測試特定的浮點數值
  • 0316、要想肯定一個數值是不是是有窮的(換句話說,是不是是位於最小和最大的數值之間),可以運用 isFinite() 函數。這個函數在參數位於最小與最大數值之間時會返回 true
  • 0317、NaN 與任何值都不相稱,包含 NaN本身18、 isNaN() 在吸收到一個值以後,會嘗試將這個值轉換為數值。某些不是數值的值會直接轉換為數值,比方字符串 “10” 或 Boolean 值。而任何不能被轉換為數值的值都邑致使這個函數返回true
  • 0318、只管有點兒難以想象,但 isNaN() 確切也適用於對象。在基於對象挪用 isNaN()函數時,會起首挪用對象的 valueOf() 要領,然後肯定該要領返回的值是不是可以轉換為數值。如果不能,則基於這個返回值再挪用 toString() 要領,再測試返回值。而這個歷程也是 ECMAScript中內置函數和操縱符的平常實行流程
  • 0319、因為 Number() 函數在轉換字符串時比較龐雜而且不夠合理,因此在處置懲罰整數的時刻更常常使用的是parseInt()函數。parseInt() 函數在轉換字符串時,更多的是看其是不是相符數值情勢。它會疏忽字符串前面的空格,直至找到第一個非空格字符。如果第一個字符不是数字字符或許負號, parseInt()就會返回 NaN ;也就是說,用 parseInt() 轉換空字符串會返回 NaN ( Number() 對空字符返回 0)。如果第一個字符是数字字符, parseInt() 會繼續剖析第二個字符,直到剖析完一切後續字符或許碰到了一個非数字字符。比方, “1234blue” 會被轉換為 1234,因為 “blue” 會被完整疏忽。類似地, “22.5”會被轉換為 22,因為小數點並不是有效的数字字符。
  • 0320、除了第一個小數點有效以外, parseFloat() 與 parseInt() 的第二個區分在於它一向都邑疏忽前導的零, parseFloat() 只剖析十進制值
  • 0321、ECMAScript 中的字符串是不可變的,也就是說,字符串一旦建立,它們的值就不能轉變。要轉變某個變量保留的字符串,起首要燒毀本來的字符串,然後再用另一個包含新值的字符串添補該變量
  • 0322、Object 的每一個實例都具有以下屬性和要領:constructor :保留着用於建立當前對象的函數。關於前面的例子而言,組織函數(constructor)就是 Object(); hasOwnProperty(propertyName) :用於搜檢給定的屬性在當前對象實例中(而不是在實例的原型中)是不是存在。个中,作為參數的屬性名( propertyName )必須以字符串情勢指定(比方: o.hasOwnProperty(“name”) );isPrototypeOf(object) :用於搜檢傳入的對象是不是是傳入對象的原型;propertyIsEnumerable(propertyName) :用於搜檢給定的屬性是不是可以運用 for-in 語句(本章背面將會議論)來羅列。與 hasOwnProperty() 要領一樣,作為參數的屬性名必須以字符串情勢指定;toLocaleString() :返回對象的字符串示意,該字符串與實行環境的地區對應;toString() :返回對象的字符串示意;valueOf() :返回對象的字符串、數值或布爾值示意。一般與 toString() 要領的返回值雷同
  • 0323、在運用於對象時,響應的操縱符一般都邑挪用對象的 valueOf()和(或) toString() 要領,以便取得可以操縱的值
  • 0324、運用 while 輪迴做不到的,運用 for 輪迴一樣也做不到。也就是說, for 輪迴只是把與輪迴有關的代碼鳩合在了一個位置
  • 0325、Safari 3 之前版本的 for-in 語句中存在一個 bug,該 bug 會致使某些屬性被返回兩次。
  • 0326、break 和 continue 語句用於在輪迴中準確地掌握代碼的實行。个中, break 語句會馬上退出輪迴,強迫繼續實行輪迴背面的語句。而 continue 語句雖然也是馬上退出輪迴,但退出輪迴後會從輪迴的頂部繼續實行
  • 0327、with 語句的作用是將代碼的作用域設置到一個特定的對象中。嚴厲情勢下不許可運用 with 語句,不然將視為語法毛病。因為大批運用 with 語句會致使機能下落,同時也會給調試代碼形成難題,因此在開闢大型運用順序時,不發起運用 with 語句
with(location){
    var qs = search.substring(1);
    var hostName = hostname;
    var url = href;
}
  • 0328、經由過程為每一個 case 背面都增加一個 break 語句,就可以防止同時實行多個 case代碼的狀況。如果確切需要夾雜幾種情況,不要忘了在代碼中增加詮釋,申明你是故意省略了 break 關鍵字。雖然 ECMAScript 中的 switch 語句自創自其他言語,但這個語句也有本身的特徵。起首,可以在switch 語句中運用任何數據範例(在很多其他言語中只能運用數值),不論是字符串,照樣對象都沒有題目。其次,每一個 case 的值不肯定是常量,可所以變量,以致是表達式
switch (i) {
    case 25:
    /*  兼并兩種情況 */
    case 35:
        alert("25 or 35");
        break;
    case 45:
        alert("45");
    break;
    default:
        alert("Other");
}
  • 0329、switch 語句在比較值時運用的是全等操縱符,因此不會發作範例轉換(比方,字符串 “10” 不即是數值 10)
  • 0330、函數會在實行完 return 語句以後住手並馬上退出。因此,位於 return 語句以後的任何代碼都永久不會實行
  • 0331、 return 語句也可以不帶有任何返回值。在這類狀況下,函數在住手實行后將返回 undefined值。這類用法平常常使用在需要提早住手函數實行而又不需要返回值的狀況下
  • 0332、嚴厲情勢對函數有一些限定:不能把函數定名為 eval 或 arguments ;不能把參數定名為 eval 或 arguments ; 不能湧現兩個定名參數同名的狀況。如果發作以上狀況,就會致使語法毛病,代碼沒法實行
  • 0333、函數體內可以經由過程 arguments 對象來接見這個參數數組,從而獵取通報給函數的每一個參數。 arguments 對象只是與數組類似(它並不是 Array 的實例),因為可以運用方括號語法接見它的每一個元素(即第一個元素是 arguments[0] ,第二個元素是 argumetns[1] ,以此類推),運用 length 屬性來肯定通報進來若干個參數
  • 0334、沒有通報值的定名參數將自動被給予 undefined 值
  • 0335、嚴厲情勢對如何運用 arguments 對象做出了一些限定。把 arguments[1] 設置為 10 , num2 的值依然照樣 undefined 。其次,重寫arguments 的值會致使語法毛病(代碼將不會實行)
  • 0336、ECMAScript 中的一切參數通報的都是值,不能夠經由過程援用通報參數
  • 0337、經由過程搜檢傳入函數中參數的範例和數目並作出差異的迴響反應,可以模仿要領的重載
  • 0338、 ECMAScript 中的基本數據範例包含 Undefined 、 Null 、 Boolean 、 Number 和 String
  • 0339、與其他言語差異,ECMScript 沒有為整數和浮點數值離別定義差異的數據範例, Number 範例可用於示意一切數值
  • 0340、ECMAScript 中也有一種龐雜的數據範例,即 Object 範例,該範例是這門言語中一切對象的基本範例
  • 0341、未指定返回值的函數返回的是一個特別的 undefined 值
  • 0342、 可以向 ECMAScript 函數通報恣意數目的參數,而且可以經由過程 arguments 對象來接見這些參數
  • 0343、當複製保留着對象的某個變量時,操縱的是對象的援用。但在為對象增加屬性時,操縱的是現實的對象

第四章、變量、作用域和內存題目

  • 0401、 typeof 操縱符是肯定一個變量是字符串、數值、布爾值,照樣 undefined 的最好東西
  • 0402、一般,我們並不是想曉得某個值是對象,而是想曉得它是什麼範例的對象。為此,ECMAScript供應了 instanceof 操縱符
  • 0403、函數參數也被算作變量來看待,因此其接見劃定規矩與實行環境中的其他變量雷同
  • 0404、在catch 語句中捕捉的毛病對象會被增加到實行環境的變量對象,而不是 catch 語句的變量對象中。換句話說,縱然是在 catch 塊的外部也可以接見到毛病對象
  • 0405、變量查詢也不是沒有價值的。很顯著,接見局部變量要比接見全局變量更快,因為不必向上搜刮作用域鏈。JavaScript 引擎在優化標識符查詢方面做得不錯,因此這個差異在未來生怕就可以疏忽不計了
  • 0406、一旦數據不再有效,最好經由過程將其值設置為 null 來開釋其援用——這個做法叫做消弭援用(dereferencing)
  • 0407、基本範例值在內存中佔有牢固大小的空間,因此被保留在棧內存中
  • 0408、 從一個變量向另一個變量複製基本範例的值,會建立這個值的一個副本
  • 0409、援用範例的值是對象,保留在堆內存中
  • 0410、包含援用範例值的變量現實上包含的並不是對象本身,而是一個指向該對象的指針
  • 0411、從一個變量向另一個變量複製援用範例的值,複製的現實上是指針,因此兩個變量終究都指向同一個對象
  • 0412、肯定一個值是哪一種基本範例可以運用 typeof 操縱符,而肯定一個值是哪一種援用範例可以運用instanceof 操縱符
  • 0413、 “標記消滅”是如今主流的渣滓收集算法,這類算法的頭腦是給當前不運用的值加上標記,然後再接納其內存
  • 0414、消弭變量的援用不僅有助於消弭輪迴援用徵象,而且對渣滓收集也有長處。為了確保有效地接納內存,應當實時消弭不再運用的全局對象、全局對象屬性以及輪迴援用變量的援用
  • 0415、除非必須運用變量來接見屬性,不然我們發起運用點示意法

第五章、援用範例

  • 0501、與對象一樣,在運用數組字面量示意法時,也不會挪用 Array 組織函數(Firefox 3及更早版本除外)
  • 0502、數組最多可以包含 4 294 967 295 個項,這險些已可以滿足任何編程需求了。如果想增加的項數凌駕這個上限值,就會發作異常。而建立一個初始大小與這個上限值靠近的數組,則能夠會致使運轉時候超長的劇本毛病
  • 0503、一切對象都具有 toLocaleString() 、 toString() 和 valueOf() 要領。个中,挪用數組的 toString() 要領會返回由數組中每一個值的字符串情勢拼接而成的一個以逗號分開的字符串。而挪用 valueOf() 返回的照樣數組。現實上,為了建立這個字符串會挪用數組每一項的 toString() 要領
  • 0504、 toLocaleString() 要領常常也會返回與 toString() 和 valueOf() 要領雷同的值,但也不老是云云
  • 0505、如果數組中的某一項的值是 null 或許 undefined ,那末該值在 join() 、toLocaleString() 、 toString() 和 valueOf() 要領返回的效果中以空字符串示意
  • 0506、push() 要領可以吸收恣意數目的參數,把它們逐一增加到數組末尾,並返回修正後數組的長度。而pop() 要領則從數組末尾移除末了一項,削減數組的 length 值,然後返回移除的項
  • 0507、棧數據結構的接見劃定規矩是 LIFO(後進先出),而行列數據結構的接見劃定規矩是 FIFO(First-In-First-Out,先進先出)
  • 0508、連繫運用 shift() 和 push() 要領,可以像運用行列一樣運用數組
  • 0509、同時運用 unshift() 和 pop() 要領,可以從相反的方一向模仿行列,即在數組的前端增加項,從數組末尾移除項
  • 0510、alert([0, 1, 5, 10, 15].sort());//0,1,10,15,5。可見,縱然例子中值的遞次沒有題目,但 sort() 要領也會根據測試字符串的效果轉變本來的遞次。因為數值 5 雖然小於 10,但在舉行字符串比較時, “10” 則位於 “5” 的前面,因此數組的遞次就被修正了。不必說,這類排序體式格局在很多狀況下都不是最好計劃。比較函數吸收兩個參數,如果第一個參數應當位於第二個之前則返回一個負數,如果兩個參數相稱則返回 0,如果第一個參數應當位於第二個以後則返回一個正數
  • 0511、因為比較函數經由過程返回一個小於零、即是零或大於零的值來影響排序效果,因此減法操縱就可以適當地處置懲罰一切這些狀況
  • 0512、 concat() 要領會先建立當前數組一個副本,然後將吸收到的參數增加到這個副本的末尾,末了返回新構建的數組。在沒有給 concat() 要領通報參數的狀況下,它只是複製當前數組並返回副本。如果通報給 concat() 要領的是一或多個數組,則該要領會將這些數組中的每一項都增加到效果數組中。如果通報的值不是數組,這些值就會被簡樸地增加到效果數組的末尾
  • 0513、slice() 要領可以接收一或兩個參數,即要返回項的肇端和完畢位置。在只需一個參數的狀況下, slice() 要領返回從該參數指定位置最先到當前數組末尾的一切項。如果有兩個參數,該要領返回肇端和完畢位置之間的項——但不包含完畢位置的項。注重, slice() 要領不會影響原始數組
  • 0514、如果 slice() 要領的參數中有一個負數,則用數組長度加上該數來肯定響應的位置。比方,在一個包含5項的數組上挪用 slice(-2,-1) 與挪用 slice(3,4) 取得的效果雷同。如果完畢位置小於肇端位置,則返回空數組
  • 0515、splice() 要領可以刪除恣意數目的項,只需指定2個參數:要刪除的第一項的位置和要刪除的項數;可以向指定位置插進去恣意數目的項,只需供應 3 個參數:肇端位置、0(要刪除的項數)和要插進去的項。如果要插進去多個項,可以再傳入第四、第五,以致恣意多個項;可以向指定位置插進去恣意數目的項,且同時刪除恣意數目的項,只需指定3個參數:肇端位置、要刪除的項數和要插進去的恣意數目的項。插進去的項數沒必要與刪除的項數相稱
  • 0516、splice() 要領一向都邑返回一個數組,該數組中包含從原始數組中刪除的項(如果沒有刪除任何項,則返回一個空數組)
  • 0517、 indexOf() 和 lastIndexOf()。這兩個要領都吸收兩個參數:要查找的項和(可選的)示意查找出發點位置的索引。个中, indexOf() 要領從數組的開首(位置0)最先向後查找,lastIndexOf()要領則從數組的末尾最先向前查找。這兩個要領都返回要查找的項在數組中的位置,或許在沒找到的狀況下返回-1。支撐它們的瀏覽器包含 IE9+、Firefox 2+、Safari3+、Opera 9.5+和 Chrome
  • 0518、ECMAScript 5 為數組定義了5個迭代要領,這些要領中的函數會吸收三個參數:數組項的值、該項在數組中的位置和數組對象本身。every() :對數組中的每一項運轉給定函數,如果該函數對每一項都返回true,則返回true;filter():對數組中的每一項運轉給定函數,返回該函數會返回true的項構成的數組;forEach():對數組中的每一項運轉給定函數。這個要領沒有返回值;map() :對數組中的每一項運轉給定函數,返回每次函數挪用的效果構成的數組;some():對數組中的每一項運轉給定函數,如果該函數對任一項返回 true ,則返回 true。以上要領都不會修正數組中的包含的值
  • 0519、這些數組要領經由過程實行差異的操縱,可以大大輕易處置懲罰數組的使命。支撐這些迭代要領的瀏覽器有IE9+、Firefox2+、Safari 3+、Opera 9.5+和 Chrome
  • 0520、 reduce() 和 reduceRight()。這兩個要領都邑迭代數組的一切項,然後構建一個終究返回的值。這兩個要領都吸收兩個參數:一個在每一項上挪用的函數和(可選的)作為合併基本的初始值。傳給reduce()和reduceRight()的函數吸收4個參數:前一個值、當前值、項的索引和數組對象。這個函數返回的任何值都邑作為第一個參數自動傳給下一項。第一次迭代發作在數組的第二項上,因此第一個參數是數組的第一項,第二個參數就是數組的第二項。運用reduce()要領可以實行求數組中一切值之和的操縱
  • 0521、運用 reduce() 照樣 reduceRight() ,主要取決於要從哪頭最先遍曆數組。除此以外,它們完整雷同
  • 0522、在挪用 Date 組織函數而不通報參數的狀況下,新建立的對象自動取得當前日期和時候
  • 0523、 Date.parse() 要領吸收一個示意日期的字符串參數,然後嘗試根據這個字符串返迴響應日期的毫秒數。ECMA-262沒有定義Date.parse() 應當支撐哪一種日期花樣,因此這個要領的行動因完成而異,而且一般是因地區而異
  • 0524、如果傳入 Date.parse()要領的字符串不能示意日期,那末它會返回NaN。現實上,如果直接將示意日期的字符串通報給 Date 組織函數,也會在背景挪用 Date.parse() 。換句話說,下面的代碼與前面的例子是等價的:var someDate = new Date(“May 25, 2004”);
  • 0525、Date.UTC() 要領一樣也返回示意日期的毫秒數,但它與Date.parse()在構建值時運用差異的信息。Date.UTC()的參數離別是年份、基於 0 的月份(一月是0,二月是1,以此類推)、月中的哪一天(1到31)、小時數(0到23)、分鐘、秒以及毫秒數。在這些參數中,只需前兩個參數(年和月)是必須的。如果沒有供應月中的天數,則假定天數為1;如果省略其他參數,則一切假定為 0。
  • 0526、ECMAScript 5 增加了 Data.now() 要領,返回示意挪用這個要領時的日期和時候的毫秒數
  • 0527、支撐 Data.now() 要領的瀏覽器包含IE9+、Firefox3+、Safari3+、Opera10.5和Chrome。在不支撐它的瀏覽器中,運用+操縱符把 Data 對象轉換成字符串,也可以到達一樣的目的
  • 0528、正則表達式。字面量聲明和組織函數聲明的區分,字面量一向會同享一個RegExp實例,而運用組織函數建立的每一個新RegExp實例都是一個新實例
  • 0529、RegExp 對象的主要要領是 exec() ,該要領是特地為捕捉組而設想的。 exec() 接收一個參數,即要運用情勢的字符串,然後返回包含第一個婚配項信息的數組;或許在沒有婚配項的狀況下返回 null 。返回的數組雖然是 Array 的實例,但包含兩個分外的屬性: index 和 input 。个中, index 示意婚配項在字符串中的位置,而 input 示意運用正則表達式的字符串。在數組中,第一項是與全部情勢婚配的字符串,其他項是與情勢中的捕捉組婚配的字符串(如果情勢中沒有捕捉組,則該數組只包含一項)
  • 0530、正則表達式的第二個要領是 test() ,它接收一個字符串參數。在情勢與該參數婚配的狀況下返回true ;不然,返回 false 。在只想曉得目的字符串與某個情勢是不是婚配,但不需要曉得其文本內容的狀況下,運用這個要領異常輕易
  • 0531、正則表達式的 valueOf() 要領返回正則表達式本身。
  • 0532、縱然 test() 要領只返回一個布爾值,但RegExp 組織函數的屬性$1和$2也會被婚配響應捕捉組的字符串自動添補
  • 0533、每一個函數都是Function範例的實例,而且都與其他援用範例一樣具有屬性和要領。因為函數是對象,因此函數名現實上也是一個指向函數對象的指針,不會與某個函數綁定
  • 0534、Function組織函數可以吸收恣意數目的參數,但末了一個參數一向都被算作是函數體,而前面的參數則羅列出了新函數的參數。然則,我們不引薦讀者運用這類要領定義函數,因為這類語法會致使剖析兩次代碼(第一次是剖析通例 ECMAScript代碼,第二次是剖析傳入組織函數中的字符串),從而影響機能
  • 0535、函數聲明式與函數表達式的區分。剖析器在向實行環境中加載數據時,對函數聲明和函數表達式並不是厚此薄彼。剖析器會領先讀取函數聲明,並使其在實行任何代碼之前可用(可以接見);至於函數表達式,則必須比及剖析器實行到它地點的代碼行,才會真正被詮釋實行
  • 0536、因為 ECMAScript中的函數名本身就是變量,所以函數也可以作為值來運用。也就是說,不僅可以像通報參數一樣把一個函數通報給另一個函數,而且可以將一個函數作為另一個函數的效果返回
  • 0537、arguments是一個類數組對象,包含着傳入函數中的一切參數。雖然 arguments 的主要用處是保留函數參數,但這個對象另有一個名叫 callee 的屬性,該屬性是一個指針,指向具有這個 arguments 對象的函數
  • 0538、this援用的是函數據以實行的環境對象——或許也可以說是this值(當在網頁的全局作用域中挪用函數時,this對象援用的就是window)
  • 0539、函數的名字僅僅是一個包含指針的變量罷了。因此,縱然是在差異的環境中實行,全局的 sayColor() 函數與 o.sayColor() 指向的依然是同一個函數
  • 0540、ECMAScript5也範例化了另一個函數對象的屬性: caller 。除了Opera的初期版本不支撐,其他瀏覽器都支撐這個 ECMAScript3並沒有定義的屬性。這個屬性中保留着挪用當前函數的函數的援用,如果是在全局作用域中挪用當前函數,它的值為null。為了完成更鬆懈的耦合,也可以經由過程 arguments.callee.caller來接見雷同的信息
  • 0541、IE、Firefox、Chrome和Safari的一切版本以及 Opera 9.6 都支撐 caller 屬性
  • 0542、當函數在嚴厲情勢下運轉時,接見arguments.callee 會致使毛病。ECMAScript5還定義了arguments.caller 屬性,但在嚴厲情勢下接見它也會致使毛病,而在非嚴厲情勢下這個屬性一向是undefined。定義這個屬性是為了分清 arguments.caller和函數的caller屬性。以上變化都是為了加強這門言語的平安性,如許第三方代碼就不能在雷同的環境里窺視其他代碼了
  • 0543、ECMAScript中的函數是對象,因此函數也有屬性和要領。每一個函數都包含兩個屬性: length和prototype 。个中,length屬性示意函數願望吸收的定名參數的個數
  • 0544、在ECMAScript5中,prototype屬性是不可羅列的,因此運用 for-in 沒法發明
  • 0545、每一個函數都包含兩個非繼續而來的要領:apply() 和 call() 。這兩個要領的用處都是在特定的作用域中挪用函數,現實上即是設置函數體內this對象的值。起首, apply() 要領吸收兩個參數:一個是在个中運轉函數的作用域,另一個是參數數組。个中,第二個參數可所以Array 的實例,也可所以arguments 對象
  • 0546、在嚴厲情勢下,未指定環境對象而挪用函數,則 this 值不會轉型為 window 。除非明白把函數增加到某個對象或許挪用 apply() 或 call() ,不然 this 值將是undefined
  • 0547、call()要領與apply()要領的作用雷同,它們的區分僅在於吸收參數的體式格局差異。關於call()要領而言,第一個參數是 this值沒有變化,變化的是其他參數都直接通報給函數。換句話說,在運用call()要領時,通報給函數的參數必須逐一枚舉出來
  • 0548、事實上,通報參數並不是 apply() 和 call() 真正的用武之地;它們真正壯大的處所是可以擴大函數賴以運轉的作用域
  • 0549、運用 call()(或apply())來擴大作用域的最大長處,就是對象不需要與要領有任何耦合關聯
  • 0550、ECMAScript 5 還定義了一個要領: bind() 。這個要領會建立一個函數的實例,其 this 值會被綁定到傳給 bind() 函數的值。支撐 bind() 要領的瀏覽器有 IE9+、Firefox 4+、Safari 5.1+、Opera 12+和 Chrome
  • 0551、為了便於操縱基本範例值,ECMAScript還供應了 3 個特別的援用範例:Boolean、Number和String。這些範例與本章引見的其他援用範例類似,但同時也具有與各自的基本範例響應的特別行動。現實上,每當讀取一個基本範例值的時刻,背景就會建立一個對應的基本包裝範例的對象,從而讓我們可以挪用一些要領來操縱這些數據
  • 0552、援用範例與基本包裝範例的主要區分就是對象的生存期。運用 new操縱符建立的援用範例的實例,在實行流脫離當前作用域之前都一向保留在內存中。而自動建立的基本包裝範例的對象,則只存在於一行代碼的實行霎時,然後馬上被燒毀。這意味着我們不能在運轉時為基本範例值增加屬性和要領
  • 0553、Object組織函數也會像工場要領一樣,根據傳入值的範例返迴響應基本包裝範例的實例。var obj = new Object(“some text”); alert(obj instanceof String); //true
  • 0554、運用new挪用基本包裝範例的組織函數,與直接挪用同名的轉型函數是不一樣的
  • 0555、 toFixed()要領會根據指定的小數位返回數值的字符串示意。如果數值本身包含的小數位比指定的還多,那末靠近指定的最大小數位的值就會舍入。可以應用round合營toFixed加爵該要領的在ie瀏覽器上的兼容題目
  • 0556、關於一個數值來說,toPrecision()要領能夠會返回牢固大小(fixed)花樣,也能夠返回指數(exponential)花樣;詳細劃定規矩是看哪一種花樣最合適。這個要領吸收一個參數,即示意數值的一切数字的位數(不包含指數部份)。現實上,toPrecision()會根據要處置懲罰的數值決議究竟是挪用 toFixed() 照樣挪用 toExponential()
  • 0557、在運用typeof操縱符測試基本範例數值時,一向會返回 “number” ,而在測試 Number 對象時,則會返回 “object” 。類似地,Number對象是Number範例的實例,而基本範例的數值則不是
  • 0558、兩個用於接見字符串中特定字符的要領是:charAt() 和 charCodeAt()。這兩個要領都吸收一個參數,即基於 0 的字符位置。个中,charAt()要領以單字符字符串的情勢返回給定位置的誰人字符(ECMAScript中沒有字符範例)
  • 0559、ECMAScript5還定義了另一個接見一般字符的要領。在支撐此要領的瀏覽器中,可以運用方括號加数字索引來接見字符串中的特定字符。運用方括號示意法接見一般字符的語法取得了 IE8 及 Firefox、Safari、Chrome 和 Opera 一切版本的支撐。如果是在IE7及更早版本中運用這類語法,會返回undefined值(只管基礎不是特別的undefined 值)
  • 0560、ECMAScript還供應了三個基於子字符串建立新字符串的要領: slice() 、 substr() 和 substring() 。這三個要領都邑返回被操縱字符串的一個子字符串,而且也都接收一或兩個參數。第一個參數指定子字符串的最先位置,第二個參數(在指定的狀況下)示意子字符串到那裡完畢。詳細來說, slice() 和substring() 的第二個參數指定的是子字符串末了一個字符背面的位置。而 substr() 的第二個參數指定的則是返回的字符個數。如果沒有給這些要領通報第二個參數,則將字符串的長度作為完畢位置。與concat() 要領一樣, slice() 、 substr() 和 substring() 也不會修正字符串本身的值——它們只是返回一個基本範例的字符串值,對原始字符串沒有任何影響。在通報給這些要領的參數是負值的狀況下,它們的行動就不盡雷同了。个中, slice() 要領會將傳入的負值與字符串的長度相加, substr() 要領將負的第一個參數加上字符串的長度,而將負的第二個參數轉換為 0。末了, substring() 要領會把一切負值參數都轉換為 0
  • 0561、IE 的 JavaScript 完成在處置懲罰向 substr() 要領通報負值的狀況時存在題目,它會返回原始的字符串。IE9 修復了這個題目
  • 0562、有兩個可以從字符串中查找子字符串的要領: indexOf() 和 lastIndexOf() 。這兩個要領都是從一個字符串中搜刮給定的子字符串,然後返子字符串的位置(如果沒有找到該子字符串,則返回 -1 )。這兩個要領的區分在於: indexOf() 要領從字符串的開首向後搜刮子字符串,而 lastIndexOf() 要領是從字符串的末尾向前搜刮子字符串。這兩個要領都可以吸收可選的第二個參數,示意從字符串中的哪一個位置最先搜刮
  • 0563、ECMAScript 5 為一切字符串定義了 trim() 要領。這個要領會建立一個字符串的副本,刪除前置及後綴的一切空格,然後返回效果。因為 trim() 返回的是字符串的副本,所以原始字符串中的前置及後綴空格會堅持穩定。支撐這個要領的瀏覽器有 IE9+、Firefox 3.5+、Safari 5+、Opera 10.5+和 Chrome。別的,Firefox 3.5+、Safari 5+和 Chrome 8+還支撐非規範的 trimLeft() 和 trimRight() 要領,離別用於刪除字符串開首和末尾的空格
  • 0564、接下來我們要引見的是一組與大小寫轉換有關的要領。ECMAScript中觸及字符串大小寫轉換的要領有 4 個:toLowerCase()、toLocaleLowerCase()、toUpperCase()和 toLocaleUpperCase() 。个中, toLowerCase() 和 toUpperCase() 是兩個典範的要領,自創自 java.lang.String 中的同名要領。而 toLocaleLowerCase() 和 toLocaleUpperCase() 要領則是針對特定地區的完成。平常來說,在不曉得本身的代碼將在哪一種言語環境中運轉的狀況下,照樣運用針對地區的要領更穩妥一些
  • 0565、String 範例定義了幾個用於在字符串中婚配情勢的要領。第一個要領就是 match() ,在字符串上挪用這個要領,本質上與挪用 RegExp 的 exec() 要領雷同。 match() 要領只接收一個參數,要麼是一個正則表達式,要麼是一個 RegExp 對象
  • 0566、另一個用於查找情勢的要領是 search() 。這個要領的唯一參數與 match() 要領的參數雷同:由字符串或 RegExp 對象指定的一個正則表達式。 search() 要領返回字符串中第一個婚配項的索引;如果沒有找到婚配項,則返回 -1 。而且, search() 要領一向是從字符串開首向後查找情勢
  • 0567、ECMAScript 供應了 replace() 要領。這個要領接收兩個參數:第一個參數可所以一個 RegExp 對象或許一個字符串(這個字符串不會被轉換成正則表達式),第二個參數可所以一個字符串或許一個函數。如果第一個參數是字符串,那末只會替換第一個子字符串。要想替換一切子字符串,唯一的方法就是供應一個正則表達式,而且要指定全局( g )標誌
  • 0568、replace() 要領的第二個參數也可所以一個函數。在只需一個婚配項(即與情勢婚配的字符串)的狀況下,會向這個函數通報 3 個參數:情勢的婚配項、情勢婚配項在字符串中的位置和原始字符串。在正則表達式中定義了多個捕捉組的狀況下,通報給函數的參數依次是情勢的婚配項、第一個捕捉組的婚配項、第二個捕捉組的婚配項……,但末了兩個參數依然離別是情勢的婚配項在字符串中的位置和原始字符串。這個函數應當返回一個字符串,示意應當被替換的婚配項運用函數作為 replace() 要領的第二個參數可以完成越發邃密的替換操縱
  • 0569、末了一個與情勢婚配有關的要領是 split() ,這個要領可以基於指定的分開符將一個字符串支解成多個子字符串,並將效果放在一個數組中。分開符可所以字符串,也可所以一個 RegExp 對象(這個要領不會將字符串算作正則表達式)。 split() 要領可以接收可選的第二個參數,用於指定數組的大小,以便確保返回的數組不會凌駕既定大小。對 split() 中正則表達式的支撐因瀏覽器而異。只管關於簡樸的情勢沒有什麼差異,但關於未發明婚配項以及帶有捕捉組的情勢,婚配的行動就不大雷同了
  • 0570、與操縱字符串有關的末了一個要領是 localeCompare() ,這個要領比較兩個字符串,並返回以下值中的一個: 如果字符串在字母表中應當排在字符串參數之前,則返回一個負數(大多半狀況下是 -1 ,詳細的值要視完成而定); 如果字符串即是字符串參數,則返回 0 ;如果字符串在字母表中應當排在字符串參數以後,則返回一個正數(大多半狀況下是 1 ,詳細的值一樣要視完成而定)。localeCompare() 要領比較異乎尋常的處所,就是完成所支撐的地區(國家和言語)決議了這個要領的行動
  • 0571、別的, String 組織函數本身另有一個靜態要領: fromCharCode() 。這個要領的使命是吸收一或多個字符編碼,然後將它們轉換成一個字符串。從本質上來看,這個要領與實例要領 charCodeAt()實行的是相反的操縱
  • 0572、 encodeURI() 主要用於全部 URI(比方,http://www.wrox.com/illegal value.htm),而 encode-URIComponent() 主要用於對 URI 中的某一段(比方前面 URI 中的 illegal value.htm )舉行編碼。它們的主要區分在於, encodeURI() 不會對本身屬於 URI 的特別字符舉行編碼,比方冒號、正斜杠、問號和井字號;而 encodeURIComponent() 則會對它發明的任何非規範字符舉行編碼
  • 0573、一 般 來 說 , 我 們 使 用 encodeURIComponent() 方 法 的 時 候 要 比 使 用encodeURI() 更多,因為在實踐中更罕見的是對查詢字符串參數而不是對基本 URI舉行編碼。
  • 0574、與 encodeURI() 和 encodeURIComponent() 要領對應的兩個要領離別是 decodeURI() 和decodeURIComponent()
  • 0575、如今,我們引見末了一個——也許也是全部 ECMAScript言語中最壯大的一個要領: eval() 。 eval()要領就像是一個完整的 ECMAScript 剖析器,它只接收一個參數,即要實行的 ECMAScript (或 JavaScript)字符串
  • 0576、可以詮釋代碼字符串的才能異常壯大,但也異常風險。因此在運用 eval() 時必須極為鄭重,特別是在用它實行用戶輸入數據的狀況下。不然,能夠會有歹意用戶輸入要挾你的站點或運用順序平安的代碼(即所謂的代碼注入)
  • 0577、个中, min() 和 max() 要領用於肯定一組數值中的最小值和最大值。這兩個要領都可以吸收恣意多個數值參數
  • 0578、要找到數組中的最大或最小值,可以像下面如許運用 apply() 要領。Math.max.apply(Math,[1,2,4,65,8,4)//65
  • 0579、下面來引見將小數值舍入為整數的幾個要領: Math.ceil() 、 Math.floor() 和 Math.round()
  • 0580、Math.random() 要領返回大於即是 0 小於 1 的一個隨機數
  • 0581、 援用範例與傳統面向對象順序設想中的類類似,但完成差異
  • 0582、Object 是一個基本範例,其他一切範例都從 Object 繼續了基本的行動
  • 0583、Array 範例是一組值的有序列表,同時還供應了操縱和轉換這些值的功用
  • 0584、Date 範例供應了有關日期和時候的信息,包含當前日期和時候以及相干的盤算功用
  • 0585、RegExp 範例是 ECMAScript 支撐正則表達式的一個接口,供應了最基本的和一些高等的正則表達式功用
  • 0586、函數現實上是 Function 範例的實例,因此函數也是對象;而這一點恰是 JavaScript 最有特徵的處所。因為函數是對象,所以函數也具有要領,可以用來加強其行動
  • 0587、因為有了基本包裝範例,所以 JavaScript 中的基本範例值可以被算作對象來接見。三種基本包裝範例離別是: Boolean 、 Number 和 String 。以下是它們配合的特徵
  • 0588、在一切代碼實行之前,作用域中就已存在兩個內置對象: Global 和 Math 。在大多半 ECMAScript完成中都不能直接接見 Global 對象;不過,Web 瀏覽器完成了負擔該角色的 window 對象。全局變量和函數都是 Global 對象的屬性。 Math 對象供應了很多屬性和要領,用於輔佐完成龐雜的數學盤算使命

第六章、面向對象的順序設想

  • 0601、ECMAScript中有兩種屬性:數據屬性和接見器屬性。數據屬性包含一個數據值的位置。在這個位置可以讀取和寫入值。數據屬性有4個形貌其行動的特徵。關於像前面例子中那樣直接在對象上定義的屬性,它們的[[Configurable]] 、[[Enumerable]]和[[Writable]]特徵都被設置為 true ,而[[Value]]特徵被設置為指定的值。要修正屬性默許的特徵,必須運用ECMAScript5的Object.defineProperty()要領。這個要領吸收三個參數:屬性地點的對象、屬性的名字和一個形貌符對象。个中,形貌符(descriptor)對象的屬性必須是:configurable、enumerable 、 writable和value。設置个中的一或多個值,可以修正對應的特徵值。可以屢次挪用Object.defineProperty() 要領修正同一個屬性,但在把configurable特徵設置為 false 以後就會有限定了。在挪用Object.defineProperty() 要領時,如果不指定,configurable、enumerable 和writable特徵的默許值都是false。多半狀況下,能夠都沒有必要應用Object.defineProperty()要領供應的這些高等功用
  • 0602、接見器屬性不包含數據值;它們包含一對兒getter 和 setter函數(不過,這兩個函數都不是必須的)。在讀取接見器屬性時,會挪用getter函數,這個函數擔任返回有效的值;在寫入接見器屬性時,會挪用setter函數並傳入新值,這個函數擔任決議如何處置懲罰數據。接見器屬性有以下 4 個特徵:[[Configurable]]、[[Enumerable]]、[[Get]]、[[Set]]
  • 0603、在不支撐Object.defineProperty()要領的瀏覽器中不能修正[[Configurable]]和[[Enumerable]]
  • 0604、支撐 Object.defineProperties()要領的瀏覽器有 IE9+、Firefox 4+、Safari 5+、Opera 12+和Chrome
  • 0605、在 JavaScript 中,可以針對任何對象——包含 DOM 和 BOM 對象,運用 Object.getOwnProperty-Descriptor() 要領。支撐這個要領的瀏覽器有 IE9+、Firefox 4+、Safari 5+、Opera 12+和 Chrome
  • 0606、工場情勢是軟件工程範疇一種廣為人知的設想情勢,這類情勢籠統了建立詳細對象的歷程。工場情勢雖然處理了建立多個類似對象的題目,但卻沒有處理對象辨認的題目(即如何曉得一個對象的範例)
  • 0607、組織器情勢。沒有顯式地建立對象;直接將屬性和要領賦給了 this 對象;沒有 return 語句。以這類體式格局挪用組織函數現實上會閱歷以下 4個步驟:建立一個新對象; 將組織函數的作用域賦給新對象(因此 this 就指向了這個新對象);實行組織函數中的代碼(為這個新對象增加屬性);返回新對象。以這類體式格局定義的組織函數是定義在 Global 對象(在瀏覽器中是 window 對象)中的。運用組織函數的主要題目,就是每一個要領都要在每一個實例上從新建立一遍。在前面的例子中, person1 和 person2 都有一個名為 sayName() 的要領,但那兩個要領不是同一個 Function 的實例
  • 0608、 prototype 就是經由過程挪用組織函數而建立的誰人對象實例的原型對象我們建立的每一個函數都有一個 prototype (原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用處是包含可以由特定範例的一切實例同享的屬性和要領。運用原型對象的長處是可以讓一切對象實例同享它所包含的屬性和要領。換句話說,沒必要在組織函數中定義對象實例的信息,而是可以將這些信息直接增加到原型對象中
  • 0609、不論什麼時刻,只需建立了一個新函數,就會根據一組特定的劃定規矩為該函數建立一個 prototype屬性,這個屬性指向函數的原型對象。在默許狀況下,一切原型對象都邑自動取得一個 constructor(組織函數)屬性,這個屬性包含一個指向 prototype 屬性地點函數的指針
  • 0610、運用 Object.getPrototypeOf()可以輕易地取得一個對象的原型,而這在應用原型完成繼續(本章稍後會議論)的狀況下是異常主要的。支撐這個要領的瀏覽器有 IE9+、Firefox 3.5+、Safari 5+、Opera 12+和 Chrome
  • 0611、運用 delete 操縱符則可以完整刪除實例屬性,從而讓我們可以從新接見原型中的屬性
  • 0612、運用 hasOwnProperty() 要領可以檢測一個屬性是存在於實例中,照樣存在於原型中。這個要領(不要忘了它是從 Object 繼續來的)只在給定屬性存在於對象實例中時,才會返回 true
  • 0613、ECMAScript 5 的 Object.getOwnPropertyDescriptor() 要領只能用於實例屬性,要取得原型屬性的形貌符,必須直接在原型對象上挪用 Object.getOwnProperty-Descriptor() 要領
  • 0614、有兩種體式格局運用 in 操縱符:零丁運用和在 for-in 輪迴中運用。在零丁運用時, in 操縱符會在經由過程對象可以接見給定屬性時返回true,不論該屬性存在於實例中照樣原型中
  • 0615、因為 in 操縱符只需經由過程對象可以接見到屬性就返回 true , hasOwnProperty() 只在屬性存在於實例中時才返回 true ,因此只需 in 操縱符返回 true 而 hasOwnProperty() 返回 false ,就可以肯定屬性是原型中的屬性
  • 0616、要取得對象上一切可羅列的實例屬性,可以運用 ECMAScript 5 的 Object.keys() 要領。這個要領吸收一個對象作為參數,返回一個包含一切可羅列屬性的字符串數組
  • 0617、如果你想要取得一切實例屬性,不論它是不是可羅列,都可以運用 Object.getOwnPropertyNames()要領。 Object.keys() 和 Object.getOwnProperty-Names() 要領都可以用來替換 for-in 輪迴。支撐這兩個要領的瀏覽器有 IE9+、Firefox 4+、Safari 5+、Opera12+和 Chrome
  • 0618、實例與原型之間的銜接只不過是一個指針,而非一個副本,因此就可以在原型中找到新的 sayHi 屬性並返回保留在那裡的函數
  • 0619、原型情勢也不是沒有瑕玷。起首,它省略了為組織函數通報初始化參數這一環節,效果一切實例在默許狀況下都將取得雷同的屬性值。雖然這會在某種水平上帶來一些不輕易,但還不是原型的最大題目。原型情勢的最大題目是由其同享的本性所致使的
  • 0620、夾雜情勢。建立自定義範例的最罕見體式格局,就是組合運用組織函數情勢與原型情勢。組織函數情勢用於定義實例屬性,而原型情勢用於定義要領和同享的屬性。效果,每一個實例都邑有本身的一份實例屬性的副本,但同時又同享着對要領的援用,最大限制地節省了內存。別的,這類混成情勢還支撐向組織函數通報參數;可謂是集兩種情勢之長。這類組織函數與原型混成的情勢,是如今在 ECMAScript中運用最普遍、認同度最高的一種建立自定義範例的要領。可以說,這是用來定義援用範例的一種默許情勢
  • 0621、運用動態原型情勢時,不能運用對象字面量重寫原型。前面已詮釋過了,如果在已建立了實例的狀況下重寫原型,那末就會割斷現有實例與新原型之間的聯絡
  • 0622、關於寄生組織函數情勢,有一點需要申明:起首,返回的對象與組織函數或許與組織函數的原型屬性之間沒有關聯;也就是說,組織函數返回的對象與在組織函數外部建立的對象沒有什麼差異。為此,不能依託 instanceof 操縱符來肯定對象範例。因為存在上述題目,我們發起在可以運用其他情勢的狀況下,不要運用這類情勢
  • 0623、繼續是 OO 言語中的一個最為人津津有味的觀點。很多 OO 言語都支撐兩種繼續體式格局:接口繼續和完成繼續。接口繼續只繼續要領署名,而完成繼續則繼續現實的要領。如前所述,因為函數沒有署名,在 ECMAScript 中沒法完成接口繼續。ECMAScript 只支撐完成繼續,而且其完成繼續重如果依託原型鏈來完成的
  • 0624、組織函數、原型和實例的關聯。每一個組織函數都有一個原型對象,原型對象都包含一個指向組織函數的指針,而實例都包含一個指向原型對象的內部指針
  • 0625、鄭重地定義要領。子範例有時刻需要重寫超範例中的某個要領,或許需要增加超範例中不存在的某個要領。但不論如何,給原型增加要領的代碼肯定要放在替換原型的語句以後
  • 0626、經由過程原型鏈完成繼續時,不能運用對象字面量建立原型要領。因為如許做就會重寫原型鏈
  • 0627、在處理原型中包含援用範例值所帶來題目的歷程當中,開闢人員最先運用一種叫做借用組織函數(constructor stealing)的手藝(有時刻也叫做捏造對象或典範繼續)。這類手藝的基本頭腦相稱簡樸,即在子範例組織函數的內部挪用超範例組織函數。別忘了,函數只不過是在特定環境中實行代碼的對象,因此經由過程運用 apply() 和 call() 要領也可以在(未來)新建立的對象上實行組織函數
  • 0628、相干於原型鏈而言,借用組織函數有一個很大的上風,即可以在子範例組織函數中向超範例組織函數通報參數
  • 0629、如果僅僅是借用組織函數,那末也將沒法防止組織函數情勢存在的題目——要領都在組織函數中定義,因此函數復用就無從談起了。而且,在超範例的原型中定義的要領,對子範例而言也是不可見的,效果一切範例都只能運用組織函數情勢。斟酌到這些題目,借用組織函數的手藝也是很少零丁運用的
  • 0630、ECMAScript 5 經由過程新增 Object.create() 要領範例化了原型式繼續。這個要領吸收兩個參數:一個用作新對象原型的對象和(可選的)一個為新對象定義分外屬性的對象。在傳入一個參數的狀況下,Object.create() 與 object() 要領的行動雷同。Object.create() 要領的第二個參數與 Object.defineProperties() 要領的第二個參數花樣雷同:每一個屬性都是經由過程本身的形貌符定義的。以這類體式格局指定的任何屬性都邑掩蓋原型對象上的同名屬性
  • 0631、寄生組合式繼續,即經由過程借用組織函數來繼續屬性,經由過程原型鏈的混成情勢來繼續要領
  • 0632、 工場情勢,運用簡樸的函數建立對象,為對象增加屬性和要領,然後返回對象。這個情勢厥後被組織函數情勢所庖代
  • 0633、 組織函數情勢,可以建立自定義援用範例,可以像建立內置對象實例一樣運用 new 操縱符。不過,組織函數情勢也有瑕玷,即它的每一個成員都沒法取得復用,包含函數。因為函數可以不局限於任何對象(即與對象具有鬆懈耦合的特性),因此沒有來由不在多個對象間同享函數
  • 0634、原型情勢,運用組織函數的 prototype 屬性來指定那些應當同享的屬性和要領。組合運用組織函數情勢和原型情勢時,運用組織函數定義實例屬性,而運用原型定義同享的屬性和要領
  • 0635、JavaScript 主要經由過程原型鏈完成繼續。原型鏈的構建是經由過程將一個範例的實例賦值給另一個組織函數的原型完成的。如許,子範例就可以接見超範例的一切屬性和要領,這一點與基於類的繼續很類似。原型鏈的題目是對象實例同享一切繼續的屬性和要領,因此不適宜零丁運用。處理這個題目的手藝是借用組織函數,即在子範例組織函數的內部挪用超範例組織函數。如許就可以做到每一個實例都具有本身的屬性,同時還能保證只運用組織函數情勢來定義範例。運用最多的繼續情勢是組合繼續,這類情勢運用原型鏈繼續同享的屬性和要領,而經由過程借用組織函數繼續實例屬性。 寄生組合式繼續,集寄生式繼續和組合繼續的長處與一身,是完成基於範例繼續的最有效體式格局
  • 0636、當某個函數被挪用時,會建立一個實行環境(execution context)及響應的作用域鏈。然後,運用 arguments 和其他定名參數的值來初始化函數的運動對象(activation object)。但在作用域鏈中,外部函數的運動對象一向處於第二位,外部函數的外部函數的運動對象處於第三位,……直至作為作用域鏈盡頭的全局實行環境

第七章 函數表達式

  • 0701、因為閉包會照顧包含它的函數的作用域,因此會比其他函數佔用更多的內存。過分運用閉包能夠會致使內存佔用過量,我們發起讀者只在相對必要時再斟酌運用閉包。雖然像 V8 等優化后的 JavaScript 引擎會嘗試接納被閉包佔用的內存,但請人人照樣要鄭重運用閉包
  • 0702、在閉包中運用 this 對象也能夠會致使一些題目。我們曉得, this 對象是在運轉時基於函數的實行環境綁定的:在全局函數中, this 即是 window ,而當函數被作為某個對象的要領挪用時, this 即是誰人對象。不過,匿名函數的實行環境具有全局性,因此其 this 對象一般指向window。但有時刻因為編寫閉包的體式格局差異,這一點能夠不會那末顯著
  • 0703、如果閉包的作用域鏈中保留着一個HTML 元素,那末就意味着該元素將沒法被燒毀
  • 0704、閉包會援用包含函數的全部運動對象,而个中包含着 element 。縱然閉包不直接援用 element ,包含函數的運動對象中也依然會保留一個援用。因此,有必要把 element 變量設置為 null 。如許就可以消弭對 DOM 對象的援用,順遂地削減其援用數,確保一般接納其佔用的內存
  • 0705、函數聲明背面不能跟圓括號。但是,函數表達式的背面可以跟圓括號。要將函數聲明轉換成函數表達式,只需像下面如許給它加上一對圓括號即可
  • 0706、平常來說,我們都應當只管少向全局作用域中增加變量和函數。在一個由很多開闢人員配合介入的大型運用順序中,過量的全局變量和函數很輕易致使定名爭執。而經由過程建立私有作用域,每一個開闢人員既可以運用本身的變量,又沒必要憂鬱攪散全局作用域
  • 0707、嚴厲來說,JavaScript 中沒有私有成員的觀點;一切對象屬性都是公有的。不過,卻是有一個私有變量的觀點。任安在函數中定義的變量,都可以以為是私有變量,因為不能在函數的外部接見這些變量。私有變量包含函數的參數、局部變量和在函數內部定義的其他函數。
  • 0708、組織函數情勢的瑕玷是針對每一個實例都邑建立一樣一組新要領,而運用靜態私有變量來完成特權要領就可以防止這個題目
  • 0709、初始化未經聲明的變量,老是會建立一個全局變量
  • 0710、多查找作用域鏈中的一個條理,就會在肯定水平上影響查找速率。而這恰是運用閉包和私有變量的一個鮮明的不足之處
  • 0711、 函數表達式差異於函數聲明。函數聲明要求有名字,但函數表達式不需要。沒有名字的函數表達式也叫做匿名函數
  • 0712、在沒法肯定如何援用函數的狀況下,遞歸函數就會變得比較龐雜
  • 0713、 遞歸函數應當一向運用 arguments.callee 來遞歸地挪用本身,不要運用函數名——函數名能夠會發作變化
  • 0714、當在函數內部定義了其他函數時,就建立了閉包。閉包有權接見包含函數內部的一切變量:在背景實行環境中,閉包的作用域鏈包含着它本身的作用域、包含函數的作用域和全局作用域;一般,函數的作用域及其一切變量都邑在函數實行完畢后被燒毀;然則,當函數返回了一個閉包時,這個函數的作用域將會一向在內存中保留到閉包不存在為止
  • 0715、運用閉包可以在 JavaScript中模仿塊級作用域(JavaScript本身沒有塊級作用域的觀點)
  • 0716、JavaScript 中的函數表達式和閉包都是極為有效的特徵,應用它們可以完成很多功用。不過,因為建立閉包必須保護分外的作用域,所以過分運用它們能夠會佔用大批內存

第八章 BOM

  • 0801、拋開全局變量會成為 window 對象的屬性不談,定義全局變量與在 window 對象上直接定義屬性照樣有一點差異:全局變量不能經由過程 delete 操縱符刪除,而直接在 window 對象上的定義的屬機可以
  • 0802、適才運用 var 語句增加的 window 屬性有一個名為 [[Configurable]] 的特徵,這個特徵的值被設置為 false ,因此如許定義的屬性不可以經由過程 delete 操縱符刪除。IE8及更早版本在碰到運用 delete刪除 window 屬性的語句時,不論該屬性最初是如何建立的,都邑拋出毛病,以示正告。IE9 及更高版本不會拋出毛病
  • 0803、嘗試接見未聲明的變量會拋出毛病,然則經由過程查詢 window 對象,可以曉得某個能夠未聲明的變量是不是存在202、窗口位置。用來肯定和修正 window 對象位置的屬性和要領有很多。IE、Safari、Opera 和 Chrome 都供應了screenLeft 和 screenTop 屬性,離別用於示意窗口相干於屏幕左側和上邊的位置。Firefox 則在screenX 和 screenY 屬性中供應雷同的窗口位置信息,Safari 和 Chrome 也同時支撐這兩個屬性。Opera雖然也支撐 screenX 和 screenY 屬性,但與 screenLeft 和 screenTop 屬性並不對應,因此發起人人不要在 Opera 中運用它們
  • 0804、終究效果,就是沒法在跨瀏覽器的條件下取得窗口左側和上邊的準確坐標值。但是,運用 moveTo()和 moveBy() 要領卻是有能夠將窗口準確地挪動到一個新位置。這兩個要領都吸收兩個參數,个中moveTo() 吸收的是新位置的 x 和 y 坐標值,而 moveBy() 吸收的是在水溫和垂直方向上挪動的像素數。
  • 0805、需要注重的是,這兩個要領能夠會被瀏覽器禁用;而且,在 Opera 和 IE 7(及更高版本)中默許就是禁用的。別的,這兩個要領都不適用於框架,只能對最外層的 window 對象運用
  • 0806、跨瀏覽器肯定一個窗口的大小不是一件簡樸的事。IE9+、Firefox、Safari、Opera 和 Chrome 均為此供應了 4個屬性: innerWidth、 innerHeight 、 outerWidth 和 outerHeight 。在 IE9+、Safari和 Firefox中, outerWidth 和 outerHeight 返回瀏覽器窗口本身的尺寸(不論是從最外層的 window 對象照樣從某個框架接見)。在Opera中,這兩個屬性的值示意頁面視圖容器① 的大小。而innerWidth 和 innerHeight則示意該容器中頁面視圖區的大小(減去邊框寬度)。在 Chrome 中, outerWidth 、 outerHeight 與innerWidth 、 innerHeight 返回雷同的值,即視口(viewport)大小而非瀏覽器窗口大小
  • 0807、在 IE、Firefox、Safari、Opera 和 Chrome 中, document.documentElement.clientWidth 和document.documentElement.clientHeight 中保留了頁面視口的信息。在 IE6 中,這些屬性必須在規範情勢下才有效;如果是混淆情勢,就必須經由過程 document.body.clientWidth 和 document.body.clientHeight 取得雷同信息。而關於混淆情勢下的 Chrome,則不論經由過程 document.documentEle-ment 照樣 document.body 中的 clientWidth 和 clientHeight 屬性,都可以取得視口的大小
  • 0808、關於挪動裝備, window.innerWidth 和 window.innerHeight 保留着可見視口,也就是屏幕上可見頁面地區的大小。挪動 IE 瀏覽器不支撐這些屬性,但經由過程 document.documentElement.client-Width 和 document.documentElement.clientHeihgt 供應了雷同的信息。跟着頁面的縮放,這些值也會響應變化
  • 0809、有關挪動裝備視口的話題比較龐雜,有很多異通例的情況,也有林林總總的發起。挪動開闢諮詢師 Peter-Paul Koch 記敘了他對這個題目的研討:http://t.cn/zOZs0Tz。如果你在做挪動 Web 開闢,引薦你讀一讀這篇文章
  • 0810、 window.open() 要領既可以導航到一個特定的 URL,也可以翻開一個新的瀏覽器窗口。這個要領可以吸收 4 個參數:要加載的 URL、窗口目的、一個特徵字符串以及一個示意新頁面是不是庖代瀏覽器歷史紀錄中當前加載頁面的布爾值。一般只須通報第一個參數,末了一個參數只在不翻開新窗口的狀況下運用。背面這行代碼會翻開一個新的可以調解大小的窗口,窗口初始大小為 400×400 像素,而且距屏幕上沿和左側各 10 像素。window.open(“http://www.wrox.com/”,”wroxWindow”,”height=400,width=400,top=10,left=10,resizable=yes”);
  • 0811、wroxWin.close()這個要領僅適用於經由過程 window.open() 翻開的彈出窗口。關於瀏覽器的主窗口,如果沒有取得用戶的許可是不能封閉它的。不過,彈出窗口卻是可以挪用 top.close() 在不經用戶許可的狀況下封閉本身。彈出窗口封閉以後,窗口的援用依然還在,但除了像下面如許檢測其 closed 屬性以外,已沒有其他用處了
  • 0812、超時挪用需要運用 window 對象的 setTimeout() 要領,它接收兩個參數:要實行的代碼和以毫秒示意的時候(即在實行代碼前需要守候若干毫秒)。因為通報字符串能夠致使機能喪失,因此不發起以字符串作為第一個參數
  • 0813、JavaScript 是一個單線順序的詮釋器,因此肯定時候內只能實行一段代碼。為了掌握要實行的代碼,就有一個 JavaScript 使命行列。這些使命會根據將它們增加到行列的遞次實行。 setTimeout() 的第二個參數通知 JavaScript 再過量長時候把當前使命增加到行列中。如果行列是空的,那末增加的代碼會馬上實行;如果行列不是空的,那末它就要等前面的代碼實行完了今後再實行
  • 0814、超時挪用的代碼都是在全局作用域中實行的,因此函數中 this 的值在非嚴厲情勢下指向 window 對象,在嚴厲情勢下是 undefined
  • 0815、平常以為,運用超時挪用來模仿間歇挪用的是一種最好情勢。在開闢環境下,很少運用真正的間歇挪用,原因是后一個間歇挪用能夠會在前一個間歇挪用完畢之前啟動。而像前面示例中那樣運用超時挪用,則完整可以防止這一點。所以,最好不要運用間歇挪用
  • 0816、經由過程 JavaScript 翻開的對話框,即“查找”和“打印”。這兩個對話框都是異步顯現的,可以將掌握權馬上交還給劇本。這兩個對話框與用戶經由過程瀏覽器菜單的“查找”和“打印”敕令翻開的對話框雷同。而在 JavaScript 中則可以像下面如許經由過程 window 對象的 find() 和 print() 要領翻開它們
  • 0817、URL獵取參數並封裝成對象。這個函數的第一步是先去掉查詢字符串開首的問號。固然,條件是 location.search 中必需要包含一或多個字符。然後,一切參數將被保留在 args 對象中,該對象以字面量情勢建立。接下來,根據和號(&)來支解查詢字符串,並返回 name=value 花樣的字符串數組。下面的 for 輪迴會迭代這個數組,然後再根據即是號支解每一項,從而返回第一項為參數名,第二項為參數值的數組。再運用 decodeURIComponent() 離別解碼 name 和 value (因為查詢字符串應當是被編碼過的)。末了,將 name 作為 args 對象的屬性,將 value 作為響應屬性的值
  • 0818、每次修正 location 的屬性( hash 除外),頁面都邑以新 URL 從新加載
  • 0819、在 IE8、Firefox 1、Safari 2+、Opera 9+和 Chrome 中,修正 hash 的值會在瀏覽器的歷史紀錄中天生一條新紀錄。在 IE 的初期版本中, hash 屬性不會在用戶單擊“退卻”和“行進”按鈕時被更新,而只會在用戶單擊包含 hash 的 URL 時才會被更新
  • 0820、replace() 要領。這個要領只接收一個參數,即要導航到的 URL;效果雖然會致使瀏覽器位置轉變,但不會在歷史紀錄中天生新紀錄。在挪用 replace() 要領以後,用戶不能回到前一個頁面
  • 0821、與位置有關的末了一個要領是 reload() ,作用是從新加載當前顯現的頁面。如果挪用 reload()時不通報任何參數,頁面就會以最有效的體式格局從新加載。也就是說,如果頁面自上次要求以來並沒有轉變過,頁面就會從瀏覽器緩存中從新加載。如果要強迫從服務器從新加載,則需要像下面如許為該要領通報參數 true。位於 reload() 挪用以後的代碼能夠會也能夠不會實行,這要取決於收集耽誤或系統資源等要素。為此,最好將 reload() 放在代碼的末了一行
  • 0822、檢測瀏覽器中是不是裝置了特定的插件是一種最罕見的檢測例程。關於非 IE 瀏覽器,可以運用plugins 數組來到達這個目的。
  • 0823、檢測 IE 中的插件比較貧苦,因為 IE 不支撐 Netscape 式的插件。在 IE 中檢測插件的唯一體式格局就是運用專有的 ActiveXObject 範例,並嘗試建立一個特定插件的實例。IE 是以 COM對象的體式格局完成插件的,而 COM對象運用唯一標識符來標識。因此,要想搜檢特定的插件,就必須曉得其 COM 標識符。比方,Flash 的標識符是 ShockwaveFlash.ShockwaveFlash
  • 0824、plugins 鳩合有一個名叫 refresh() 的要領,用於革新 plugins 以反應最新裝置的插件。這個要領吸收一個參數:示意是不是應當從新加載頁面的一個布爾值。如果將這個值設置為 true ,則會從新加載包含插件的一切頁面;不然,只更新 plugins鳩合,不從新加載頁面
  • 0825、history 對象保留着用戶上網的歷史紀錄,從窗口被翻開的那一刻算起。因為 history 是 window對象的屬性,因此每一個瀏覽器窗口、每一個標籤頁以致每一個框架,都有本身的 history 對象與特定的window 對象關聯
  • 0826、運用 go() 要領可以在用戶的歷史紀錄中恣意跳轉,可以向後也可以向前。這個要領接收一個參數,示意向後或向前跳轉的頁面數的一個整數值。負數示意向後跳轉(類似於單擊瀏覽器的“退卻”按鈕),正數示意向前跳轉(類似於單擊瀏覽器的“行進”按鈕)。也可以給 go() 要領通報一個字符串參數,此時瀏覽器會跳轉到歷史紀錄中包含該字符串的第一個位置——能夠退卻,也能夠行進,詳細要看哪一個位置近來。如果歷史紀錄中不包含該字符串,那末這個要領什麼也不做
  • 0827、別的,還可以運用兩個簡寫要領 back() 和 forward() 來替代 go() 。望文生義,這兩個要領可以模仿瀏覽器的“退卻”和“行進”按鈕
  • 0828、當頁面的 URL 轉變時,就會天生一條歷史紀錄。在 IE8 及更高版本、Opera、Firefox、Safari 3 及更高版本以及 Chrome 中,這裏所說的轉變包含 URL 中 hash 的變化(因此,設置 location.hash 會在這些瀏覽器中天生一條新的歷史紀錄)
  • 0829、瀏覽器對象模子(BOM)以 window 對象為依託,示意瀏覽器窗口以及頁面可見地區。同時, window對象照樣 ECMAScript 中的 Global 對象,因此一切全局變量和函數都是它的屬性,且一切原生的組織函數及其他函數也都存在於它的定名空間下

第九章 客戶端檢測

  • 0901、檢測 Web 客戶端的手腕很多,而且各有利弊。但最主要的照樣要曉得,不到萬不得已,就不要運用客戶端檢測。只需能找到更通用的要領,就應當優先採納更通用的要領。一言以蔽之,先設想最通用的計劃,然後再運用特定於瀏覽器的手藝加強該計劃
  • 0902、在現實開闢中,應當將才能檢測作為肯定下一步處理計劃的根據,而不是用它來推斷用戶運用的是什麼瀏覽器
  • 0903、與才能檢測類似,怪癖檢測(quirks detection)的目的是辨認瀏覽器的特別行動。但與才能檢測確認瀏覽器支撐什麼才能差異,怪癖檢測是想要曉得瀏覽器存在什麼缺點(“怪癖”也就是 bug)
  • 0904、才能檢測:在編寫代碼之前先檢測特定瀏覽器的才能
  • 0905、 怪癖檢測:怪癖現實上是瀏覽器完成中存在的 bug
  • 0906、用戶代辦檢測:經由過程檢測用戶代辦字符串來辨認瀏覽器
  • 0907、在決議運用哪一種客戶端檢測要領時,平常應優先斟酌運用才能檢測。怪癖檢測是肯定應當如何處置懲罰代碼的第二挑選。而用戶代辦檢測則是客戶端檢測的末了一種計劃,因為這類要領對用戶代辦字符串具有很強的依託性
    原文作者:科瑞茲曼
    原文地址: https://segmentfault.com/a/1190000014699505
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞