| JavaScript簡介JavaScript簡史JavaScript 誕生于 1995 年。 JavaScript實(shí)現(xiàn)一個(gè)完整的 JavaScript 實(shí)現(xiàn)由下列三個(gè)不同的部分組成: 
 ECMAScriptECMA-262 標(biāo)準(zhǔn)沒有參照 web 瀏覽器,它規(guī)定了這門語言的下列組成部分:語法、類型、語句、關(guān)鍵字、保留字、操作符、對象。 文檔對象模型(DOM)文檔對象模型(DOM,Document Object Model)是針對 XML 但經(jīng)過擴(kuò)展用于 HTML 的應(yīng)用程序編程接口(API)。 瀏覽器對象模型(BOM)瀏覽器對象模型(BOM,Browser Object Model)從根本上將,BOM 只處理瀏覽器窗口和框架,但人們習(xí)慣上也把所有針對瀏覽器的 JavaScript 擴(kuò)展算作 BOM 的一部分,下面就是一些這樣的擴(kuò)展: 
 小結(jié)JavaScript 是一種專門與網(wǎng)頁交互而設(shè)計(jì)的腳本語言,由下列三個(gè)部分組成: 
 在HTML中使用JavaScriptscript元素向 HTML 頁面中插入 JavaScript 的主要方法就是使用  使用  注意:使用  標(biāo)簽的位置按照傳統(tǒng)的做法,所有  可是這種做法有一種缺點(diǎn)就是,必須要等到全部 JS 代碼都被下載、解析和執(zhí)行完成以后,才能開始出現(xiàn)頁面的內(nèi)容(瀏覽器在遇到  延遲腳本
 假設(shè)把  defer 屬性只適用于外部腳本文件。 異步腳本HTML5 為  例如,在  異步腳本一定會在頁面的 load 事件前執(zhí)行,但可能會在 DOMContentLoaded 事件觸發(fā)前或后執(zhí)行。 嵌入代碼與外部文件使用外部文件的優(yōu)點(diǎn): 
 文檔模式兩種文檔模式:混雜模式(quirks mode)、標(biāo)準(zhǔn)模式(standards mode)。 noscript元素這個(gè)元素用以在不支持 JS 的瀏覽器中顯示替代的內(nèi)容。 包含  
 基本概念語法區(qū)分大小寫ECMAScript 中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。 標(biāo)識符標(biāo)識符就是指變量、函數(shù)、屬性的名字,或函數(shù)的參數(shù)。 標(biāo)識符按照以下規(guī)則組合: 
 不能把關(guān)鍵字、保留字、true、false、null 用作標(biāo)識符。 注釋嚴(yán)格模式嚴(yán)格模式是為 JS 定義了一種不同的解析與執(zhí)行模型。在嚴(yán)格模式下,一些不確定的行為將得到處理,對某些不安全的操作會拋出錯(cuò)誤。 要在整個(gè)腳本中啟用嚴(yán)格模式,可以在頂部添加下列代碼: 它是一個(gè)編譯指示(pragma),用來告訴支持 JS 引擎切換到嚴(yán)格模式。 可以指定函數(shù)在嚴(yán)格模式下執(zhí)行: 語句ECMAScript 中語句以一個(gè)分號結(jié)尾。如果省略分號,則由解析器確定語句的結(jié)尾。 雖然語句結(jié)尾的分號并不是必須的,但最好還是不要省略。因?yàn)榧由戏痔柨梢员苊夂芏噱e(cuò)誤,也會在某些情況下增進(jìn)代碼性能。 關(guān)鍵字和保留字關(guān)鍵字可用于表示控制語句的開始或結(jié)束,或用于執(zhí)行特定操作等。關(guān)鍵字不能用作標(biāo)識符。 ECMA-262 還描述了一組不能用作標(biāo)識符的保留字。 變量ECMAScript 的變量是松散類型的,就是可以用來保存任何類型的數(shù)據(jù)。 定義變量時(shí)要使用 var 操作符(var是一個(gè)關(guān)鍵字),后跟變量名(即標(biāo)識符)。 如果省略 var 操作符可以定義全局變量,但這也不是我們所推薦的。因?yàn)樵诰植孔饔糜蛑卸x的全局變量很難維護(hù),而且如果有意地忽略了 var 操作符,也會由于相應(yīng)變量不會馬上就有定義而導(dǎo)致不必要的混亂。給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會拋出 ReferenceError 錯(cuò)誤。 數(shù)據(jù)類型簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):undefined、null、boolean、number、string、symbol(ES 6新引入的數(shù)據(jù)類型)。 復(fù)雜數(shù)據(jù)類型:object。 typeof操作符typeof 用來檢測給定變量的數(shù)據(jù)類型,只適用于基本數(shù)據(jù)類型的類型判斷。 對一個(gè)值使用 typeof 操作符可能返回下列某個(gè)字符串: 
 undefined類型undefined 類型只有一個(gè)值,即特殊的 undefined。在使用 var 聲明變量但未對其加以初始化時(shí),這個(gè)變量的值就是 undefined。 對未初始化的變量執(zhí)行 typeof 操作符會返回 undefined 值,而對未聲明的變量執(zhí)行 typeof 操作符同樣也會返回 undefined 值。 null類型null 類型也只有一個(gè)值,這個(gè)特殊的值是 null。 使用 typeof 操作符檢測 null 值時(shí)會返回 “object” : boolean類型boolean 類型只有兩個(gè)值:true、false。 注意:boolean 類型的值是區(qū)分大小寫的,True、False(以及其他的混合大小寫形式)都不是 boolean 的值,只是標(biāo)識符。 要將一個(gè)值轉(zhuǎn)換為其對應(yīng)的 boolean 值,可以調(diào)用轉(zhuǎn)型函數(shù) Boolean()。 number類型八進(jìn)制字面值的第一位必須是零(0),然后是八進(jìn)制數(shù)字序列(0~7)。如果字面值中的數(shù)值超出了范圍,那前導(dǎo)零將被忽略,后面的數(shù)值將被當(dāng)作十進(jìn)制數(shù)解析。 十六進(jìn)制字面值的前兩位必須是0x,后面跟任何十六進(jìn)制數(shù)字(09及AF),其他A~F可以大寫,也可以小寫。 在進(jìn)行算術(shù)計(jì)算時(shí),所有以八進(jìn)制、十六進(jìn)制表示的數(shù)值最后將被轉(zhuǎn)換成十進(jìn)制數(shù)值。 浮點(diǎn)數(shù)值浮點(diǎn)數(shù)值就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字。 數(shù)值范圍ECMAScript 能夠表示的最小數(shù)值存在 Number.MIN_VALUE 中,在大多數(shù)瀏覽器中,這個(gè)值是 5e-324。 ECMAScript 能夠表示的最大數(shù)值存在 Number.MAX_VALUE 中,在大多數(shù)瀏覽器中,這個(gè)值是 1.7976931348623157e+308。 如果計(jì)算結(jié)果超出了 JavaScript 數(shù)值范圍時(shí),那么這個(gè)數(shù)值將被自動轉(zhuǎn)換成 Infinity 值。如果這個(gè)數(shù)值為負(fù)數(shù),將被轉(zhuǎn)換成 -Infinity(負(fù)無窮),如果這個(gè)數(shù)值為正數(shù),將被轉(zhuǎn)換成 Infinity(正無窮)。 NaN即非數(shù)值是一個(gè)特殊的數(shù)值,這個(gè)數(shù)值用于表示一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會拋出錯(cuò)誤)。 有兩個(gè)特點(diǎn)。首先,任何涉及 NaN 的操作都會返回 NaN,這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問題。其次,NaN 與任何值都不相等,包括 NaN 本身。 針對這兩個(gè)特點(diǎn),ECMAScript 定義了 isNaN() 函數(shù)。這個(gè)函數(shù)接受一個(gè)參數(shù),該參數(shù)可以是任何類型,而函數(shù)會幫我們確定這個(gè)參數(shù)是否“不是數(shù)值”。某些不是數(shù)值的值會直接轉(zhuǎn)換為數(shù)值。 數(shù)值轉(zhuǎn)換有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()、parseInt()、parseFloat()。 Number() 函數(shù)可以用于任何數(shù)據(jù)類型,另外兩個(gè)函數(shù)則專門用于把字符串轉(zhuǎn)為數(shù)值。這三個(gè)函數(shù)對于同樣的輸入會有返回不同的結(jié)果。 Number() 函數(shù)的轉(zhuǎn)換規(guī)則: 
 string類型string 類型用于表示由零或多個(gè) 16 位 Unicode 字符組成的字符序列,即字符串。 字符字面量String 數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列。 
 字符串的特點(diǎn)ECMAScript 的字符串是不可變的,也就是說,字符串一旦創(chuàng)建,它們的值就不能改變。如果要改變某個(gè)變量保存的字符串,首先要摧毀原來的字符串,然后再用另一個(gè)包含新值得字符串填充該變量。 轉(zhuǎn)換為字符串把一個(gè)值轉(zhuǎn)換為一個(gè)字符串有兩種方式。第一種是使用幾乎每個(gè)值都有得 toString() 方法。 在不知道要轉(zhuǎn)換的值是不是 null 或 undefined 的情況時(shí),還可以使用轉(zhuǎn)型函數(shù) String(),這個(gè)函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串。 String()函數(shù)遵循下列轉(zhuǎn)換規(guī)則: 
 Object類型ECMAScript 中的對象其實(shí)就是一組數(shù)據(jù)和功能的集合。 對象可以通過執(zhí)行 new 操作符后跟要?jiǎng)?chuàng)建的對象類型的名稱來創(chuàng)建。而創(chuàng)建 Object 類型的實(shí)例并為其添加屬性和(或)方法,就可以創(chuàng)建自定義對象。 Object 的每個(gè)實(shí)例都具有下列屬性和方法: 
 操作符操作符包括算術(shù)操作符(如加號和減號)、位操作符、關(guān)系操作符、相等操作符。 一元操作符只能操作一個(gè)值的操作符叫一元操作符。 遞增和遞減操作符前置型、后置型。前置型應(yīng)該位于要操作的變量之前,后置型應(yīng)該位于要操作的變量之后。 執(zhí)行前置遞增和遞減操作時(shí),變量的值都是在語句被求值以前改變的。 后置的遞增和遞減操作是在包含它們的語句被求值之后才執(zhí)行的。 在應(yīng)用于不同的值時(shí),遞增和遞減操作符遵循下列規(guī)則: 
 一元加和減操作符一元加操作符以一個(gè)加號(+)表示,放在數(shù)值前面,對數(shù)值不會產(chǎn)生任何影響。 一元減操作符主要用于表示負(fù)數(shù)。 位操作符位操作符不直接操作 64 位的值,而是先將 64 位的值轉(zhuǎn)換成 32 位的整數(shù),然后執(zhí)行操作,最后再將結(jié)果轉(zhuǎn)換回 64 位。 對于有符號的整數(shù),32 位中的前 31 位用于表示整數(shù)的值。第 32 位表示數(shù)值的符號:0表示正數(shù),1表示負(fù)數(shù)。這個(gè)表示符號的位叫符號位。 負(fù)數(shù)以二進(jìn)制碼存儲,使用的格式是二進(jìn)制補(bǔ)碼,計(jì)算一個(gè)數(shù)值的二進(jìn)制補(bǔ)碼,經(jīng)過以下步驟: 
 如果對非數(shù)值應(yīng)用位操作符,會先使用 Number() 函數(shù)將該值轉(zhuǎn)換為一個(gè)數(shù)值,然后再應(yīng)用位操作,得到的結(jié)果是一個(gè)數(shù)值。 按位非(NOT)按位非操作符由一個(gè)波浪線(~)表示。 執(zhí)行按位非得結(jié)果就是返回?cái)?shù)值得反碼。 按位非操作的本質(zhì):操作數(shù)的負(fù)值減 1。 按位非是在數(shù)值表示的最底層執(zhí)行操作,因此速度更快。 按位與(AND)按位與操作符由一個(gè)和號字符(&)表示,它由兩個(gè)操作符數(shù)。 按位與操作只在兩個(gè)數(shù)值的對應(yīng)位都是 1 時(shí)才返回 1,任何一位是 0,結(jié)果都是 0。 按位或(OR)按位或操作符由一個(gè)豎線(|)表示,也有兩個(gè)操作符。 按位或操作在有一個(gè)位是 1 的情況下就返回 1,而只有在兩個(gè)位都是 0 的情況下才返回 0。 按位異或(XOR)按位異或操作符由一個(gè)插入符號(^)表示,也有兩個(gè)操作符。 按位異或操作在兩個(gè)數(shù)值對應(yīng)位上只有一個(gè) 1 時(shí)才返回 1,如果對應(yīng)的兩位都是 1 或 0,則返回 0。 左移左移操作符由兩個(gè)小于號(<<)表示,這個(gè)操作符會將數(shù)值的所有位向左移動指定的位數(shù)。 在向左移位后,原數(shù)值的右側(cè)就多出了空位,就用 0 來填充空位。 左移不會影響操作數(shù)的符號位。 有符號的右移有符號的右移操作符由兩個(gè)大于號(>>)表示,這個(gè)操作符會將數(shù)值向右移動,但保留符號位(即正負(fù)號標(biāo)記)。 在右移過程中,原數(shù)值出現(xiàn)空位,用符號位的值來填充空位。 無符號右移無符號右移操作符由 3 個(gè)大于號(>>>)表示,這個(gè)操作符會將數(shù)值的所有 32 位都向右移動。對正數(shù)來說,無符號右移的結(jié)果與有符號右移相同。 對于負(fù)數(shù)來說,無符號右移是以 0 來填充空位。 布爾操作符布爾操作符一共有 3 個(gè):非(NOT)、與(AND)、或(OR)。 邏輯非邏輯非操作符由一個(gè)嘆號(!)表示。邏輯非操作符首先會將它的操作數(shù)轉(zhuǎn)換為一個(gè)布爾值,然后再對其求反。 邏輯非操作符遵循以下規(guī)則: 
 邏輯非操作符也可以用于將一個(gè)值轉(zhuǎn)換為與其對應(yīng)的布爾值,用同時(shí)使用兩個(gè)邏輯非操作符(!!)。 邏輯與邏輯與操作符由兩個(gè)和號(&&)表示,有兩個(gè)操作數(shù)。 在有一個(gè)操作數(shù)不是布爾值的情況下,邏輯與操作不一定返回布爾值,此時(shí)遵循下列規(guī)則: 
 邏輯與操作屬于短路操作,即第一個(gè)操作數(shù)能夠決定結(jié)果,那么就不會再對第二個(gè)操作數(shù)求值。 邏輯或邏輯或操作符由兩個(gè)豎線符號(||)表示,也有兩個(gè)操作數(shù)。 遵循以下規(guī)則: 
 邏輯或操作符也是短路操作符,如果第一個(gè)操作數(shù)的求值結(jié)果為 true,就不會對第二個(gè)操作數(shù)求值。 乘性操作符3 個(gè)乘性操作符:乘法、除法、求模。 乘法乘法操作符由一個(gè)星號(*)表示,用于計(jì)算兩個(gè)數(shù)值的乘積。 在處理特殊值情況下,遵循下列特殊規(guī)則: 
 除法除法操作符由一個(gè)斜線符號(/)表示,執(zhí)行第二個(gè)操作數(shù)除第一個(gè)操作數(shù)的計(jì)算。 在處理特殊值情況下,遵循下列特殊規(guī)則: 
 求模求模(余數(shù))操作符由一個(gè)百分號(%)表示。 在處理特殊值情況下,遵循下列特殊規(guī)則: 
 加性操作符加法加法操作符(+) 如果兩個(gè)操作符都是數(shù)值,執(zhí)行常規(guī)的加法計(jì)算,然后根據(jù)下列規(guī)則返回結(jié)果: 
 如果有一個(gè)操作符是字符串,就要應(yīng)用如下規(guī)則: 
 如果有一個(gè)操作數(shù)是對象、數(shù)值、布爾值,則調(diào)用它們的 toString() 方法取得相應(yīng)的字符串值,然后再應(yīng)用關(guān)于字符串的規(guī)則。 對于 undefined 和 null,則分別調(diào)用 String() 函數(shù)并取得字符串“undefined”和“null”。 減法減法操作符(-) 一樣需要遵循如下特殊規(guī)則: 
 關(guān)系操作符小于(<)、大于(>)、小于等于(<=)和大于等于(>=)這幾個(gè)關(guān)系操作符用于對兩個(gè)值進(jìn)行比較,這幾個(gè)操作符都返回一個(gè)布爾值。 當(dāng)關(guān)系操作符的操作數(shù)使用了非數(shù)值時(shí),要進(jìn)行數(shù)據(jù)轉(zhuǎn)換或完成某些操作。以下就是其規(guī)則: 
 相等操作符ES 提供兩組操作符:相等和不相等——先轉(zhuǎn)換再比較,全等和不全等——僅比較不轉(zhuǎn)換。 相等和不相等相等操作符由兩個(gè)等于號(==)表示,如果兩個(gè)操作數(shù)相等,返回 true。 不相等操作符由嘆號后跟等于號(!=)表示,如果兩個(gè)操作數(shù)不相等,返回 false。 這兩個(gè)操作符都會先轉(zhuǎn)換操作數(shù)(通常稱為強(qiáng)制轉(zhuǎn)型),然后比較它們的相等性。 在轉(zhuǎn)換不同數(shù)據(jù)類型時(shí),遵循下列規(guī)則: 
 這兩個(gè)操作符在比較時(shí)遵循下列規(guī)則: 
 全等和不全等全等操作符由 3 個(gè)等于號(===)表示,它只在兩個(gè)操作數(shù)未經(jīng)轉(zhuǎn)換就相等的情況下返回 true。 不全等操作符由一個(gè)嘆號后跟兩個(gè)等于號(!==)表示,它在兩個(gè)操作數(shù)未經(jīng)轉(zhuǎn)換就不相等的情況下返回 true。 注意:null == undefined 返回 true,因?yàn)樗鼈兪穷愃频闹?;?null === undefined 會返回 false。 條件操作符條件操作符遵循與 Java 中的條件操作符相同的語法形式。 賦值操作符簡單的賦值操作符由等于號(=)表示,其作用就是把右側(cè)的值賦給左側(cè)的變量。 如果在等于號(=)前面再添加乘性操作符、加性操作符或位操作符,就可以完成復(fù)合賦值操作。 每個(gè)主要算術(shù)操作符都有對應(yīng)的復(fù)合賦值操作符,這些操作符如下: 
 逗號操作符使用逗號操作符可以在一條語句中執(zhí)行多個(gè)操作。 逗號操作符多用于聲明多個(gè)變量,還可以用于賦值。用于賦值時(shí),逗號操作符總會返回表達(dá)式中的最后一項(xiàng)。 語句語句通常使用一或多個(gè)關(guān)鍵字來完成給定任務(wù)。 if語句語法如下: 其中的 condition(條件)可以是任意表達(dá)式。如果對 condition 求值的結(jié)果為 true,則執(zhí)行 statement1(語句1),否則執(zhí)行 statement2(語句2)。 do-while語句do-while 語句是一種后測試循環(huán)語句,即只有在循環(huán)體中的代碼執(zhí)行之后,才會測試出口條件。換句話說,在對條件表達(dá)式求值之前,循環(huán)體內(nèi)的代碼至少會被執(zhí)行一次。語法如下: while語句while 語句屬于前測試循環(huán)語句,也就是說,在循環(huán)體內(nèi)的代碼被執(zhí)行之前,就會對出口條件求值。因此,循環(huán)體內(nèi)的代碼有可能永遠(yuǎn)不會被執(zhí)行。語法如下: for語句for 語句也是一種前測試循環(huán)語句,但它具有在執(zhí)行循環(huán)之前初始化變量和定義循環(huán)后要執(zhí)行的代碼能力。語法如下: 在 for 循環(huán)的變量初始化表達(dá)式中,也可以不使用 var 關(guān)鍵字,該變量的初始化可以在外部執(zhí)行。 for 語句中的初始化表達(dá)式、控制表達(dá)式和循環(huán)后表達(dá)式都是可選的,如果將三個(gè)表達(dá)式全部省略,就會創(chuàng)建一個(gè)無限循環(huán)。 for-in語句for-in 語句是一種精準(zhǔn)的迭代語句,可以用來枚舉對象的屬性。語法如下: 如果表示要迭代的對象的變量值為 null 或 undefined,for-in 語句會拋出錯(cuò)誤。ES5 更正了這一行為,對這種情況不再拋出錯(cuò)誤,而只是不執(zhí)行循環(huán)體。為了保證最大限度的兼容性,建議在使用 for-in 循環(huán)之前,先檢測該對象的值不是 null 或 undefined。 label語句使用 label 語句可以在代碼中添加標(biāo)簽,以便將來使用。語法如下: 示例: break和continue語句break 和 continue 語句用于在循環(huán)中精確地控制代碼的執(zhí)行。 break 語句會立即退出循環(huán),強(qiáng)制繼續(xù)執(zhí)行循環(huán)后面的語句。continue 語句雖然也是立即退出循環(huán),但退出循環(huán)后會從循環(huán)的頂部繼續(xù)執(zhí)行。 with語句with 語句的作用是將代碼的作用域設(shè)置到一個(gè)特定的對象中。語法如下: 定義 with 語句的目的主要是為了簡化多次編寫同一個(gè)對象的工作,實(shí)例: 以上代碼可以使用 with 語句改寫成如下: 注意:在嚴(yán)格模式下不允許使用 with 語句,否則將視為語法錯(cuò)誤。 由于大量使用 with 語句會導(dǎo)致性能下降,同時(shí)也會給調(diào)試代碼造成困難,因此在開發(fā)大型應(yīng)用程序時(shí),不建議使用 with 語句。 switch語句switch 語句與 if 語句的關(guān)系最為密切。語法如下: 含義為:如果表達(dá)式等于這個(gè)值(value),則執(zhí)行后面的語句。而 break 關(guān)鍵字會導(dǎo)致代碼執(zhí)行流跳出 switch 語句。如果省略 break,就會導(dǎo)致執(zhí)行完當(dāng)前 case 后,繼續(xù)執(zhí)行下一個(gè) case。最后的 default 關(guān)鍵字則用于在表達(dá)式不匹配前面任何一種情形時(shí),執(zhí)行機(jī)動代碼(也相當(dāng)于 else 語句)。 switch 語句在比較值時(shí)使用的是全等操作符,因此不會發(fā)生類型轉(zhuǎn)換。 函數(shù)通過函數(shù)可以封裝任意多條語句,而且可以在任何地方、任何時(shí)候調(diào)用執(zhí)行。 ES 中的函數(shù)使用 function 關(guān)鍵字來聲明,后跟一組參數(shù)以及函數(shù)體。語法如下: ES 中的函數(shù)在定義時(shí)不必指定是否返回值。實(shí)際上,任何函數(shù)在任何時(shí)候都可以通過 return 語句后跟要返回的值來實(shí)現(xiàn)返回值。示例如下: 這個(gè) sum() 函數(shù)的作用是把兩個(gè)值加起來返回一個(gè)結(jié)果。 調(diào)用這個(gè)函數(shù)的代碼如下: 這個(gè)函數(shù)會在執(zhí)行完 return 語句之后停止并立即退出,因此位于 return 之后的任何代碼將不會被執(zhí)行。 另外,return 語句也可以不帶有任何返回值。函數(shù)在停止執(zhí)行后將返回 undefined 值,這種用法一般用在需要提前停止函數(shù)執(zhí)行而又不需要返回值的情況下使用。 嚴(yán)格模式對函數(shù)有一些限制,如下: 
 理解參數(shù)在函數(shù)體內(nèi)可以通過 arguments 對象來訪問這個(gè)參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)。 ES 函數(shù)一個(gè)重要特定:命名的參數(shù)只提供便利,但不是必需的。 沒有傳遞值的命名參數(shù)將自動被賦予 undefined 值。 ES 中的所有參數(shù)傳遞的都是值,不可能通過引用傳遞參數(shù)。 沒有重載ES 函數(shù)不能像傳統(tǒng)意義上那樣實(shí)現(xiàn)重載。ES 函數(shù)沒有簽名,因?yàn)槠鋮?shù)是由包含零或多個(gè)值的數(shù)組來表示的。而沒有函數(shù)簽名,真正的重載是不可能做到的。 如果在 ES 中定義了兩個(gè)名字相同的函數(shù),則該名字只屬于后定義的函數(shù)。 小結(jié)下面簡要總結(jié) ES 中的基本要素: 
 變量、作用域和內(nèi)存問題基本類型和引用類型的值ES變量可能包含兩種不同數(shù)據(jù)類型的值: 基本類型值指的是簡單的數(shù)據(jù)段,而引用類型值指那些可能由多個(gè)值構(gòu)成的對象。 引用類型的值是保存在內(nèi)存中的對象。JavaScript不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時(shí),實(shí)際上是在操 作對象的引用而不是實(shí)際的對象。因此,引用類型的值是按引用訪問的。 動態(tài)的屬性定義基本類型值和引用類型值的方式是類似的:創(chuàng)建一個(gè)變量并為該變量賦值。 我們不能給基本類型的值添加屬性,只能給引用類型值動態(tài)地添加屬性。 復(fù)制變量值除了保存的方式不同之外,在從一個(gè)變量向另一個(gè)變量復(fù)制基本類型值和引用類型值時(shí),也存在不同。如果從一個(gè)變量向另一個(gè)變量復(fù)制基本類型的值,會在變量對象上創(chuàng)建一個(gè)新值,然后把該值復(fù)制到為新變量分配的位置上,例如: 以上代碼中,num1中保存的值為5.當(dāng)使用num1的值來初始化num2時(shí),num2中也保存了值5.但num2中的5與num1的5是完全獨(dú)立的,該值只是num1中5的一個(gè)副本。此后,這兩個(gè)變量可以參與任何操作而不會相互影響。 當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值時(shí),同樣也會將存儲在變量對象中的值復(fù)制一份到為新變量分配的空間中。不同的是,這個(gè)值的副本實(shí)際上是一個(gè)指針,而這個(gè)指針指向存儲在堆中的一個(gè)對象。復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對象。因此,改變其中一個(gè)變量,就會音響另一個(gè)變量,例如: 以上代碼中,變量obj1保存了一個(gè)對象的新實(shí)例。然后這個(gè)值被復(fù)制到了obj2中。obj1和obj2都指向同一個(gè)對象。這樣,當(dāng)為obj1添加name屬性后,可以通過obj2來訪問這個(gè)屬性。 傳遞參數(shù)ES中所有函數(shù)的參數(shù)都是按值傳遞的。也就是說,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。例子: 以上代碼中,函數(shù)addTen()有一個(gè)參數(shù)num,而參數(shù)實(shí)際上是函數(shù)的局部變量。在調(diào)用函數(shù)時(shí),變量count作用參數(shù)被傳遞給函數(shù),這個(gè)變量值為20。于是數(shù)值20被復(fù)制給參數(shù)num以便在addTen()中使用。在函數(shù)內(nèi)部,參數(shù)num值被加上了10,這一變化不會影響函數(shù)外部的count變量。 檢測類型要檢測一個(gè)變量是不是基本數(shù)據(jù)類型,typeof操作符是最佳的工具。 typeof操作符是確定一個(gè)變量是字符串、數(shù)值、布爾值,還是undefined的最佳工具,如果變量值是null或?qū)ο?,則會返回"object"。 因此,ES提供了instanceof操作符,語法如下: 如果變量是給定引用類型的實(shí)例,那么instanceof操作符就會返回true。 執(zhí)行環(huán)境及作用域
 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會被推入一個(gè)環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。 當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會創(chuàng)建變量對象的一個(gè)作用域鏈。作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 延長作用域鏈雖然執(zhí)行環(huán)境的類型總共只有兩種:全局和局部(函數(shù)),但還是有其他辦法延長作用域鏈的。因?yàn)橛行┱Z句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對象,該變量對象會在代碼執(zhí)行后被移除。在兩種情況下會發(fā)生這種情況。具體的說就是當(dāng)執(zhí)行流進(jìn)入下列任何一個(gè)語句時(shí),作用域鏈就會得到加長: 
 這兩個(gè)語句都會在作用域鏈的前端添加一個(gè)變量對象。對with語句來說,會將指定的對象添加到作用域鏈中。對catch來說,會創(chuàng)建一個(gè)新的變量對象,其中包含的是被拋出的錯(cuò)誤對象的聲明。 沒有塊級作用域聲明變量使用var聲明的變量會自動被添加到最接近的環(huán)境中。在函數(shù)內(nèi)部,最接近的環(huán)境就是函數(shù)的局部環(huán)境;在with語句中,最接近的環(huán)境是函數(shù)環(huán)境。如果初始化變量時(shí)沒有使用var聲明,該變量會自動被添加到全局環(huán)境。例如: 以上代碼中,函數(shù)add()定義了一個(gè)名為sum的局部變量,該變量包含加法的操作結(jié)果。雖然結(jié)果值從函數(shù)中返回了,但變量sum在函數(shù)外部是訪問不到的。如果省略例子中var關(guān)鍵字,那么add()執(zhí)行完畢后,sum也將可以訪問到: 查詢標(biāo)識符當(dāng)在某個(gè)環(huán)境中為了讀取或?qū)懭攵靡粋€(gè)標(biāo)識符時(shí),必須通過搜索來確定該標(biāo)識符實(shí)際代表什么。搜索過程從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標(biāo)識符。如果在局部環(huán)境中找到了該標(biāo)識符,就停止搜索,變量就緒。如果在局部環(huán)境中沒有找到,則繼續(xù)沿作用域鏈向上搜索。搜索過程將一直追溯到全局環(huán)境的變量對象。如果在全局環(huán)境中沒有找到標(biāo)識符,則意味著該變量尚未聲明。 垃圾收集JavaScript具有自動垃圾收集機(jī)制,也就是說,執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。 標(biāo)記清除JavaScript中最常用的垃圾收集方式是 引用計(jì)數(shù)另一種不太常見的垃圾收集策略叫 性能問題垃圾收集器是周期性運(yùn)行的。 IE的垃圾收集器是根據(jù)內(nèi)存分配量運(yùn)行的,具體一點(diǎn)說就是256個(gè)變量、4096個(gè)對象(或數(shù)組)字面量和數(shù)組元素(slot)或者64KB的字符串,達(dá)到上述任何一個(gè)臨界值,垃圾收集器就會運(yùn)行。 在IE中,調(diào)用window.CollectGarbage()方法會立即執(zhí)行垃圾收集。 管理內(nèi)存JavaScript在進(jìn)行內(nèi)存管理及垃圾收集時(shí),最主要的一個(gè)問題是,分配給web瀏覽器的可用內(nèi)存數(shù)量通常要比分配給桌面應(yīng)用程序的少。這樣做的目的主要是出于安全方面考慮,目的是防止運(yùn)行JavaScript的網(wǎng)頁耗盡全部系統(tǒng)內(nèi)存而導(dǎo)致系統(tǒng)崩潰。內(nèi)存限制問題不僅會影響給變量分配內(nèi)存,同時(shí)還會影響調(diào)用棧以及在一個(gè)線程中能夠同時(shí)執(zhí)行的語句數(shù)量。 因此,確保占用最少的內(nèi)存可以讓頁面獲得更好的性能。而優(yōu)化內(nèi)存占用的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。一旦數(shù)據(jù)不再有用,最好通過將其值設(shè)置為null來釋放其引用,這個(gè)做法叫做 小結(jié)JavaScript變量可以用來保存兩種類型的值:基本類型值和引用類型值。 基本類型值和引用類型值具有以下特點(diǎn): 
 所有變量都存在于一個(gè)執(zhí)行環(huán)境(也稱作用域)當(dāng)中,這個(gè)執(zhí)行環(huán)境決定了變量的生命周期,以及哪一部分代碼可以訪問其中的變量。 以下是關(guān)于執(zhí)行環(huán)境的幾點(diǎn)總結(jié): 
 JavaScript是一門具有自動垃圾收集機(jī)制的編程語言,開發(fā)人員不必關(guān)心內(nèi)存分配和回收問題,可以對JavaScript的垃圾收集例程做如下總結(jié): 
 引用類型Object類型創(chuàng)建Object實(shí)例的兩種方式: 
 
 在對象字面量中,使用逗號來分隔不同的屬性,并且在最后一個(gè)屬性后面不能添加逗號。 在使用對象字面量時(shí),屬性名也可以使用字符串;如果留空其花括號,則可以定義只包含默認(rèn)屬性和方法的對象。 | 
|  |