以下筆記大部分整理自《JavaScript權(quán)威指南》,本文僅方便大家遇到問題時(shí)快速查詢。建議大家閱讀原書。
水平有限,如有錯(cuò)誤請大家指正。
1) 讀未聲明的變量會(huì)產(chǎn)生錯(cuò)誤。寫未聲明的變量會(huì)是JavaScript環(huán)境自動(dòng)產(chǎn)生一個(gè)全局變量。
2) 對于完全等同“===”,兩個(gè)null或者兩個(gè)undefined是等同的;但null與undefined是不等同的。
3) 對于相等“==”, null與undefined是相等的。若值與對象比較,核心語言內(nèi)部類會(huì)嘗試用valueof()轉(zhuǎn)換,再嘗試用toString()轉(zhuǎn)換。就是說valueof()會(huì)比toString()有更高的優(yōu)先級。但規(guī)則不絕對,例如Date類,它會(huì)首先嘗試用toString()轉(zhuǎn)換。當(dāng)類的這兩個(gè)方法實(shí)現(xiàn)不一致時(shí),在要進(jìn)行類型轉(zhuǎn)換時(shí)指定具體的實(shí)現(xiàn)方法比較安全。
4) 在比較運(yùn)算中,若一個(gè)對象或值被轉(zhuǎn)換成NaN(Not a Number),則永遠(yuǎn)返回false。
5) in可以檢查指定字符串是否是一個(gè)對象的基本屬性或方法名稱;instanceof運(yùn)算符返回左邊的對象是否右邊類的一個(gè)實(shí)例;delete可以刪除一個(gè)屬性,它不會(huì)影響到屬性關(guān)聯(lián)的對象的生存,若該屬性不存在會(huì)返回true;[]可以以字符串的方式存取對象的屬性。
6) typeof函數(shù)的返回值:數(shù)字——number,字符串——string,布爾值——Boolean,對象、數(shù)組、null——object,函數(shù)名——function或undefined(未定義時(shí))。主要用來區(qū)別區(qū)別對象和原始類型。要區(qū)分對象的具體類型,用instanceof運(yùn)算符。
7) 在函數(shù)體內(nèi)有隱含的arguments對象,可取得所有傳入的參數(shù),可用類似數(shù)組的方式讀/寫各參數(shù),length屬性表示參數(shù)的個(gè)數(shù)。但函數(shù)的只讀屬性length表示函數(shù)實(shí)際定義的參數(shù)個(gè)數(shù)。一個(gè)名為callee的屬性代表函數(shù)本身。
8) 構(gòu)造函數(shù)也是函數(shù),但它通過new調(diào)用,無返回值。函數(shù)體內(nèi)通過this來取得將要初始化的對象。
9) 對象的方法可用this對對象自身進(jìn)行操作,其它方面與普通的函數(shù)沒有任何區(qū)別。
10) 每個(gè)類都有一個(gè)原型(prototype)對象,它具有一套屬性和方法,用來共享一個(gè)類的方法和常量,還有一個(gè)constructor的屬性引用構(gòu)造函數(shù)。
11) JavaScript中面向?qū)ο蟮奶匦裕?/span>
a) 實(shí)例屬性:在構(gòu)造函數(shù)創(chuàng)建或初始化的屬性。
b) 實(shí)例方法:在構(gòu)造函數(shù)中把原型對象中的一個(gè)屬性設(shè)為函數(shù)來實(shí)現(xiàn)。
c) 類屬性:構(gòu)造函數(shù)本身的屬性。
d) 類方法:用合適的函數(shù)作為構(gòu)造函數(shù)本身的一個(gè)屬性。
e) 子類:把原型對象賦值為父類的一個(gè)實(shí)例,默認(rèn)父類為Object的實(shí)例。同時(shí)還要將prototype.constructor賦值為子類的構(gòu)造函數(shù)自己。
f) 繼承:只是在查詢一個(gè)屬性時(shí)自動(dòng)發(fā)生,而不會(huì)在寫屬性時(shí)發(fā)生,就是說單寫一個(gè)父類的屬性時(shí),JavaScript環(huán)境會(huì)為對象本身創(chuàng)建一個(gè)同名的屬性,從此該屬性就覆蓋了父類中的屬性。
12) 創(chuàng)建一個(gè)數(shù)組可用 new Array() 。可以在構(gòu)造函數(shù)參數(shù)中指定數(shù)組的前n個(gè)元素的值。數(shù)組的元素可以具有任意類型,甚至是另外一個(gè)數(shù)組。同一數(shù)組中可以存在不同類型的元素。數(shù)組的length是可讀寫的。這也是縮短一個(gè)數(shù)組的唯一方法。
1) Window類的實(shí)例是全局對象,用它的window或者self屬性可引用它自己。
2) 一個(gè)應(yīng)用程序出現(xiàn)的每個(gè)窗口或框架都對應(yīng)一個(gè)Window對象,而且都為客戶端JavaScript代碼定義了一個(gè)唯一的執(zhí)行環(huán)境。
3) 腳本執(zhí)行過程是Web瀏覽器的HTML解析過程的一部分。腳本按照它們的出現(xiàn)順序執(zhí)行。
4) 簡單的對話框可用:alert()、 confirm()、 prompt()之一。
5) 時(shí)間間隔方法為: setInterval()、 cleraInterval() 。
6) onerror屬性指明錯(cuò)誤處理的方式。 navigator屬性包含Web瀏覽器總體信息。 screen屬性包含顯示器的信息。
7) 打開窗口用open()方法,返回值是被打開的窗口。調(diào)用應(yīng)該明確指明是window.open(),以避免和document.open()方法混淆。同時(shí)還應(yīng)該調(diào)用focus()方法使窗口成焦點(diǎn)保證窗口可見。opener屬性是打開自己的那個(gè)窗口,若是用戶手動(dòng)打開,這位null。
8) 關(guān)閉窗口用window.close()方法,窗口關(guān)閉后,代表它的Window對象可能還生存,可用closed屬性進(jìn)行判斷它是否已經(jīng)被關(guān)閉。
9) 控制窗口幾何大小可用moveTo()、moveBy()、resizeTo()、resizeBy()。滾動(dòng)可用scrollTo、scrollBy()。
10) 成焦點(diǎn)和失焦點(diǎn)可用 focus()、blur()。
11) location屬性代表當(dāng)前顯示文檔的URL。對其賦值使瀏覽器裝載新的URL(用Back按鈕能回退到原頁面)。其實(shí),它是Location類的一個(gè)實(shí)例,它還有一個(gè)reload()方法可以裝載信的URL(用Back按鈕不能回退到原頁面)。
12) history屬性可看成是代表歷史URL的一個(gè)特殊數(shù)組,它的可讀length屬性表明數(shù)組的長度。支持三種方法back()、forword()、go()。
13) 一個(gè)窗口中的任何框架都可以使用屬性frames、parent和top引用窗口中的其它框架。
14) 若框架指定了名字,引用就會(huì)被存儲(chǔ)到它的父Window對象的一個(gè)同名新屬性中。
15) 自定義的函數(shù)和構(gòu)造函數(shù)只在定義它的窗口中可見。別的窗口要先通過一個(gè)屬性來引用。但JavaScript默認(rèn)的函數(shù)和構(gòu)造函數(shù)會(huì)在每個(gè)窗口中擁有獨(dú)立副本。
16) onload()和onunload()事件分別在網(wǎng)頁裝載完成后和卸載前執(zhí)行。
1) Document類的實(shí)例(即window.document)有forms[]、images[]、links[]、applets[]幾大數(shù)組。也可以通過與name屬性一樣的Document的屬性直接訪問這些元素,或者通過數(shù)組的命名屬性訪問。如:document.forms.f1 = document.forms.[“f1”]。
2) links[]代表文檔中的Link對象數(shù)組,由HTML的<a herf …>或者<area>定義,Link對象代表超級鏈接的URL,具有Location類的所以屬性。
3) anchors[]代表文檔中的Link對象數(shù)組,由HTML的<a>定義。
4) applets[]代表文檔中的Link對象數(shù)組,由HTML的<applet>或<object>嵌入在文檔中的Applet對象組成。
5) embeds[]代表文檔中的Link對象數(shù)組,由HTML的<embed>或<object>嵌入在文檔的非Applet對象組成。
6) Write()方法可以生成網(wǎng)頁內(nèi)容,但只能在文檔被解釋時(shí)調(diào)用,即在<script>塊中調(diào)用。創(chuàng)建新文檔的標(biāo)準(zhǔn)格式為:xxx.document.open(); xxx.document.write(“ABC”); … xxx.document.close(); 其中的open()方法是可選的, JavaScript會(huì)隱式打開一個(gè)新的文檔。
7) 用Image()構(gòu)造函數(shù)能產(chǎn)生一個(gè)屏外圖像,強(qiáng)迫瀏覽器裝載圖像,其onload事件處理程序能在圖片裝載后馬上執(zhí)行。
1) Form類的實(shí)例代表一個(gè)HTML表單,通過Document的forms[]數(shù)組可以得到其實(shí)例。
2) elements[]數(shù)組代表表單中所有輸入元素,并可通過type屬性知道每個(gè)元素的具體類型。
3) submit()方法和reset()方法分別用于提交或者重置表單。但與直接點(diǎn)擊按鈕不一樣,兩個(gè)方法不會(huì)出發(fā)對應(yīng)的onsubmit和onrest事件。
4) 如果HTML的<Form>定義了name屬性,則Document對象會(huì)多存儲(chǔ)一個(gè)同名屬性,指向該Form對象。各元素的情況類似,同時(shí)如果表單中由多個(gè)HTML元素的name屬性相同,這些元素會(huì)被存放到一個(gè)數(shù)組中,按元素的出現(xiàn)順序排序。
1) 能用Document的cookie屬性對Web瀏覽器的cookie進(jìn)行操作,其屬性是一個(gè)特殊的字符串屬性。
2) cookie除了名值對外,還有四個(gè)可選屬性:expires——有效期、path——可見路徑、domain——可見域、secure——是否在安全協(xié)議間傳輸。
3) cookie值不能有分號(hào)、逗號(hào)或空白符,所以要用escape()方法進(jìn)行編碼,讀取時(shí)用unescape()進(jìn)行解碼。
4) cookie的默認(rèn)屬性通過字符串“;expires=…”的形式附加,其中有效期要用Data.toGMTString()格式化。
5) 要改變一個(gè)cookie的值,用同名字和新值再設(shè)置cookie一次。要?jiǎng)h除,將同名值、任意值加上一個(gè)過去的有效期來設(shè)置。
6) 讀取一個(gè)cookie時(shí),返回一個(gè)字符串,是name=value對的列表,用分號(hào)隔開。
1) 可用Document對象的implementation.hasFeature()方法查詢是否支持特定的DOM特性。
2) Document中有childNodes、firstChild、lastChild、nextSibling、previousSibling來遍歷各個(gè)節(jié)點(diǎn)。
3) Document中的getElementsByTagName()方法返回指定HTML標(biāo)記類型的數(shù)組。方法的參數(shù)不分大小寫,可用“*”來返回所有元素。
4) Document中的getElementsById()方法返回指定id的元素。
5) DocumentFragment是一種特殊類型的節(jié)點(diǎn),自身不會(huì)出現(xiàn)在文檔中,只作為連續(xù)節(jié)點(diǎn)集合的臨時(shí)容器,用createDocumentFragment()創(chuàng)建。
1) CSS樣式由一個(gè)名/值的性質(zhì)對列表指定,性質(zhì)對之間用分號(hào)隔開,名稱和值之間用冒號(hào)分隔。
2) 樣式性質(zhì)如果有“inherit”的話,說明它應(yīng)該繼承自己父元素的值。
3) 可用特殊快捷性質(zhì)把常常在一齊使用的樣式性質(zhì)組合在一起。就是“快捷性質(zhì)名:連續(xù)多個(gè)值”。如:font:bold italic 24pt Helvetica; 。
4) CSS的規(guī)則從一個(gè)選擇器開頭,指定HTML元素(小寫),用大括號(hào)括起屬性和值。用逗號(hào)分隔開頭的選擇器名稱表示樣式都適用于它們。若無逗號(hào)分隔,表示一個(gè)標(biāo)記嵌套在另一個(gè)標(biāo)記時(shí)適用。還可以用“.”號(hào)開頭指定HTML元素的類,HTML元素的類由HTML中的class屬性指定,可混用以上的兩種方法。用“#”開頭指定適用于具體id的HTML元素。
5) 樣式表可以放在<head>部分的<style>和</style>標(biāo)記之間?;蛴?/span><link>引用??苫煊靡陨蟽煞N方法,在<style>標(biāo)記范圍內(nèi)用@import引用。
6) 用戶樣式覆蓋默認(rèn)樣式,作者樣式覆蓋用戶樣式,內(nèi)聯(lián)樣式覆蓋所有樣式。一個(gè)元素上應(yīng)用多個(gè)樣式,最為詳細(xì)規(guī)則定義的樣式將覆蓋不太詳細(xì)規(guī)則定義樣式相沖突的部分。
7) 只要position屬性不是被設(shè)為static,就可以用left、top、right、bottom這些性質(zhì)的任意組合來定義元素的位置。width、height定義大小,單位可以是:%、px(像素)、in(英寸)、cm(厘米)、pt(點(diǎn))、em(當(dāng)前字體行高)。
8) z-index默認(rèn)為0,值越小越先被繪制,此規(guī)則只適用于同一容器內(nèi)的子元素。
9) visibility、display都可以控制可見性,同設(shè)為none時(shí),在常規(guī)的流布局中,visibility是分配了空間,display沒有分配空間。
10) 用overflow指定超出元素邊框是的處理。用clip確定顯示元素的哪些部分。用rect指定具體區(qū)域。
11) 在JavaScipt中,獲取了一個(gè)HTML元素后,就可以通過元素的style屬性獲取那個(gè)元素的CSS2Propertites對象。設(shè)置這些屬性與設(shè)置HTML元素的style性質(zhì)中的效果一樣。但無法用JavaScript來設(shè)定樣式表的信息。同時(shí)緊記,在使用CSS2Propertites對象的樣式屬性時(shí),所有值都必須是字符串(要加上引號(hào)),有單位的情況也記得加上單位。CSS2Propertites沒有提供查詢CSS級聯(lián)的方法,也沒有提供判斷應(yīng)用于特定元素的完整樣式集合的方法。
12) JavaScript中CSS性質(zhì)的命名規(guī)范:去掉CSS性質(zhì)名中包含的所以連字符(減號(hào)),且把原來緊接在連字符后的字母改成大寫。若CSS性質(zhì)對應(yīng)有float屬性,給屬性要加上css前綴,變成cssFloat。
1) 主要的基本事件:onabor、onblur、onchange、onclick、onerror、onfocus、onkeydown、onkeypress、onkeyup、onload、onmousedown、onmouseout、onmouseover、onmouseup、onrest、onresize、onselect、onsubmit、onunload。
2) 事件處理程序被設(shè)置為JavaScript代碼串,作為HTML的性質(zhì)值,并在Document對象中有同名的JavaScript屬性映射。當(dāng)通過JavaScript進(jìn)行訪問時(shí),事件處理程序的屬性時(shí)函數(shù)。要通過JavaScript把一個(gè)事件處理程序賦給一個(gè)文檔的元素,只要把事件處理程序?qū)傩栽O(shè)置為想用的函數(shù)即可,應(yīng)該把函數(shù)自身賦予事件處理程序?qū)傩?,而不是調(diào)用函數(shù)的結(jié)果,所以函數(shù)名稱后無需加括號(hào),或者用匿名函數(shù)。
3) 可以用JavaScript直接調(diào)用事件處理函數(shù),但這不是模擬事件發(fā)生的真實(shí)狀況,只是執(zhí)行定影行為的那個(gè)屬性值的函數(shù)。
4) 顯式地調(diào)用事件處理函數(shù)可以通過JavaScript擴(kuò)展HTML代碼定義地事件處理函數(shù)(AOP??。?,如: var oldHandler = b.onclick; function newHandler(){…} b.onclick = function() {oldHandler(); newHandler()} 。
5) 如果瀏覽器執(zhí)行某種默認(rèn)動(dòng)作來相應(yīng)一個(gè)事件,那么返回false可以阻止瀏覽器執(zhí)行那個(gè)動(dòng)作。一個(gè)例外是鼠標(biāo)移動(dòng)到一個(gè)超鏈上,要阻止默認(rèn)動(dòng)作,onmouseover事件處理程序要返回true。
6) HTML性質(zhì)的事件處理程序作用域的頭是調(diào)用的對象,下一個(gè)是觸發(fā)事件處理程序的事件對象,還會(huì)延伸到包容層,最終到達(dá)Window對象。同時(shí),作用鏈的精確構(gòu)成尚未標(biāo)準(zhǔn)化,不同的瀏覽器有不同的實(shí)現(xiàn)。理想的方法是讓它們只調(diào)用在別的地方定義的全局函數(shù)。
7) 在IE4~6中,用Event對象提供發(fā)生事件的詳細(xì)情況,它是Window對象的一個(gè)屬性(全局)。
8) 利用onPropertyChange事件,可捕捉多種情況,例如鍵盤輸入、粘貼等,是捕捉對象內(nèi)容改變的良好方式。
1) 同源策略:一個(gè)腳本只能讀取與它同源的窗口或文檔屬性。如果兩個(gè)窗口(或框架)含有的腳本把domain設(shè)為相同,他們就自動(dòng)滿足此策略。
1) JavaScript可以訪問Applet的公共字段和方法。
2) Java與JavaScript的所有交互都能由netscape.javascript.JSObject類的實(shí)例來處理??上Р还苁?/span>Netscape還是IE都有bug!
3) Nescape的LiveConnect技術(shù)還允許JavaScript程序?qū)嵗约旱?/span>Java對象并使用他們,但IE不支持!
1) 把合理的字符串轉(zhuǎn)換成數(shù)字的簡單方法:表示數(shù)字的字符串變量 – 0 。
2) 把數(shù)字轉(zhuǎn)換成字符串的簡單方法: 數(shù)字(或數(shù)字變量) + “” 。
3) 用String類的localeCompare()方法對中文字排序,能出到按拼音排序的效果。
4) 利用Number類的toFixed()方法,可以格式化小數(shù)位數(shù)。
5) 用Window對象的 showModalDialog()方法可以打開一個(gè)模態(tài)窗口,showModelessDialog()可以可以打開一個(gè)非模態(tài)的窗口。
1) 大部分的HTML元素都會(huì)以其name屬性在JavaScript環(huán)境中映射為屬性,所以為HTML元素起名字要非常小心,不要覆蓋主要JavaScript的對象名稱或者方法名稱。
2) 不能在JavaScript代碼中出現(xiàn)“</script>”,哪怕是字符串。若要出現(xiàn)該字符串,至少要表示為:”</” + “script>” 的形式。