JavaScript
[1]是一種基于對(duì)象和
事件驅(qū)動(dòng)并具有相對(duì)安全性的客戶端腳本語(yǔ)言。同時(shí)也是一種廣泛用于客戶端Web開(kāi)發(fā)的腳本語(yǔ)言,常用來(lái)給HTML網(wǎng)頁(yè)添加動(dòng)態(tài)功能,比如響應(yīng)用戶的各種操作。它最初由網(wǎng)景公司的Brendan Eich設(shè)計(jì),是一種動(dòng)態(tài)、弱類型、基于原型的語(yǔ)言,內(nèi)置支持類。JavaScript是Sun公司的注冊(cè)商標(biāo)。[1] Ecma國(guó)際以JavaScript為基礎(chǔ)制定了ECMAScript標(biāo)準(zhǔn)。JavaScript也可以用于其他場(chǎng)合,如服務(wù)器端編程。完整的JavaScript實(shí)現(xiàn)包含三個(gè)部分:ECMAScript,文檔對(duì)象模型,字節(jié)順序記號(hào)?!?
Netscape公司在最初將其腳本語(yǔ)言命名為L(zhǎng)iveScript。在
Netscape在與
Sun合作之后將其改名為JavaScript。JavaScript最初受Java啟發(fā)而開(kāi)始設(shè)計(jì)的,目的之一就是“看上去像Java”[2],因此語(yǔ)法上有類似之處,一些名稱和命名規(guī)范也借自Java。但JavaScript的主要設(shè)計(jì)原則源自Self和Scheme[3].JavaScript與Java名稱上的近似,是當(dāng)時(shí)網(wǎng)景為了營(yíng)銷考慮與Sun公司達(dá)成協(xié)議的結(jié)果。為了取得技術(shù)優(yōu)勢(shì),微軟推出了JScript來(lái)迎戰(zhàn)JavaScript的腳本語(yǔ)言。為了互用性,Ecma國(guó)際(前身為歐洲計(jì)算機(jī)制造商協(xié)會(huì))創(chuàng)建了ECMA-262標(biāo)準(zhǔn)(ECMAScript)?,F(xiàn)在兩者都屬于ECMAScript的實(shí)現(xiàn)。盡管JavaScript作為給非程序人員的腳本語(yǔ)言,而非作為給程序人員的編程語(yǔ)言來(lái)推廣和宣傳,但是JavaScript具有非常豐富的特性。
目前javascript的最新版本為1.9版。
1、運(yùn)算符
運(yùn)算符就是完成操作的一系列符號(hào),它有七類:
賦值運(yùn)算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算術(shù)運(yùn)算符(+,-,*,/,++,--,%)、比較運(yùn)算符(>,<,<=,>=,==,===,!=,!==)、邏輯運(yùn)算符(||,&&,!)、條件運(yùn)算(?:)、位移運(yùn)算符(|,&,<<,>>,~,^)和字符串運(yùn)算符(+)。
!==是不全等于符號(hào)。
可能很多人不知道"==="是什么。在這里,我為大家解釋一下,在JavaScript中,“==="是全同運(yùn)算符,只有當(dāng)值相等,數(shù)據(jù)類型也相等時(shí)才成立。
等同運(yùn)算符的比較規(guī)則:
當(dāng)兩個(gè)運(yùn)算數(shù)的類型不同時(shí):將他們轉(zhuǎn)換成相同的類型。
1)一個(gè)數(shù)字與一個(gè)字符串,字符串轉(zhuǎn)換成數(shù)字之后,進(jìn)行比較。
2)true轉(zhuǎn)換為1、false轉(zhuǎn)換為0,進(jìn)行比較。
3)一個(gè)對(duì)象、
數(shù)組、函數(shù)與 一個(gè)數(shù)字或字符串,對(duì)象、數(shù)組、函數(shù)轉(zhuǎn)換為原始類型的值,然后進(jìn)行比較。(先使用valueOf,如果不行就使用toString)
4)其他類型的組合不相等。
想兩個(gè)運(yùn)算數(shù)類型相同,或轉(zhuǎn)換成相同類型后:
1)2個(gè)字符串:同一位置上的字符相等,2個(gè)字符串就相同。
2)2個(gè)數(shù)字:2個(gè)數(shù)字相同,就相同。如果一個(gè)是NaN,或兩個(gè)都是NaN,則不相同。
3)2個(gè)都是true,或者2個(gè)都是false,則相同。
4)2個(gè)引用的是同一個(gè)對(duì)象、函數(shù)、數(shù)組,則他們相等,如果引用的不是同一個(gè)對(duì)象、函數(shù)、數(shù)組,則不相同,即使這2個(gè)對(duì)象、函數(shù)、數(shù)組可以轉(zhuǎn)換成完全相等的原始值。
5)2個(gè)null,或者2個(gè)都是未定義的,那么他們相等。
而“===”是全同運(yùn)算符,全同運(yùn)算符遵循等同運(yùn)算符的比較規(guī)則,但是它不對(duì)運(yùn)算數(shù)進(jìn)行類型轉(zhuǎn)換,當(dāng)兩個(gè)運(yùn)算數(shù)的類型不同時(shí),返回false;只有當(dāng)兩個(gè)運(yùn)算數(shù)的類型相同的時(shí)候,才遵循等同運(yùn)算符的比較規(guī)則進(jìn)行比較。
例如:null==undefined 會(huì)返回真, 但是null===undefined 就會(huì)返回假!
2、表達(dá)式
運(yùn)算符和操作數(shù)的組合稱為表達(dá)式,通常分為四類:賦值表達(dá)式、算術(shù)表達(dá)式、
布爾表達(dá)式和字符串表達(dá)式。
3、語(yǔ)句
JavaScript程序是由若干語(yǔ)句組成的,語(yǔ)句是編寫程序的指令。JavaScript提供了完整的基本編程語(yǔ)句,它們是:
賦值語(yǔ)句、switch選擇語(yǔ)句、while循環(huán)語(yǔ)句、for循環(huán)語(yǔ)句、for each循環(huán)語(yǔ)句、do...while循環(huán)語(yǔ)句、break循環(huán)中止語(yǔ)句、continue循環(huán)中斷語(yǔ)句、with語(yǔ)句、try…catch語(yǔ)句、if語(yǔ)句(if..else,if…else if…)。
4、函數(shù)
函數(shù)是命名的語(yǔ)句段,這個(gè)語(yǔ)句段可以被當(dāng)作一個(gè)整體來(lái)引用和執(zhí)行。使用函數(shù)要注意以下幾點(diǎn):
1)函數(shù)由關(guān)鍵字function定義(也可由Function構(gòu)造函數(shù)構(gòu)造)
2)使用function關(guān)鍵字定義的函數(shù)在一個(gè)作用域內(nèi)是可以在任意處調(diào)用的(包括定義函數(shù)的語(yǔ)句前);而用var關(guān)鍵字定義的必須定義后才能被調(diào)用
3)函數(shù)名是調(diào)用函數(shù)時(shí)引用的名稱,它對(duì)大小寫是敏感的,調(diào)用函數(shù)時(shí)不可寫錯(cuò)函數(shù)名
4)參數(shù)表示傳遞給函數(shù)使用或操作的值,它可以是常量,也可以是變量,也可以是函數(shù),在函數(shù)內(nèi)部可以通過(guò)arguments對(duì)象(arguments對(duì)象是一個(gè)偽數(shù)組,屬性callee引用被調(diào)用的函數(shù))訪問(wèn)所有參數(shù)
5)return語(yǔ)句用于返回表達(dá)式的值。
6)yield語(yǔ)句扔出一個(gè)表達(dá)式,并且中斷函數(shù)執(zhí)行直到下一次調(diào)用next。
一般的函數(shù)都是以下格式:
function myFunction(params){
//執(zhí)行的語(yǔ)句
}
函數(shù)表達(dá)式:
var myFunction=function(params){
//執(zhí)行的語(yǔ)句
}
var myFunction = function(){
//執(zhí)行的語(yǔ)句
}
myFunction();//調(diào)用函數(shù)
匿名函數(shù),它常作為參數(shù)在其他函數(shù)間傳遞:
window.addEventListener('load',function(){
//執(zhí)行的語(yǔ)句
},false);
5、對(duì)象
JavaScript的一個(gè)重要功能就是面向?qū)ο蟮墓δ?,通過(guò)基于對(duì)象的程序設(shè)計(jì),可以用更直觀、模塊化和可重復(fù)使用的方式進(jìn)行程序開(kāi)發(fā)。
一組包含數(shù)據(jù)的屬性和對(duì)屬性中包含數(shù)據(jù)進(jìn)行操作的方法,稱為對(duì)象。比如要設(shè)定網(wǎng)頁(yè)的背景顏色,所針對(duì)的對(duì)象就是document,所用的屬性名是bgcolor,如document.bgcolor="blue",就是表示使背景的顏色為藍(lán)色。
6、事件
用戶與網(wǎng)頁(yè)交互時(shí)產(chǎn)生的操作,稱為事件。事件可以由用戶引發(fā),也可能是頁(yè)面發(fā)生改變,甚至還有你看不見(jiàn)的事件(如Ajax的交互進(jìn)度改變)。絕大部分事件都由用戶的動(dòng)作所引發(fā),如:用戶按鼠標(biāo)的按鍵,就產(chǎn)生click事件,若鼠標(biāo)的指針在鏈接上移動(dòng),就產(chǎn)生mouseover事件等等。在JavaScript中,事件往往與事件處理程序配套使用。
而對(duì)事件的處理,W3C的方法是用addEventListener()函數(shù),它有三個(gè)參數(shù):事件,引發(fā)的函數(shù),是否使用事件捕捉。為了安全性,建議將第三個(gè)參數(shù)始終設(shè)置為false
傳統(tǒng)的方法就是定義
元素的on…事件,它就是W3C的方法中的事件參數(shù)前加一個(gè)“on”。而IE的事件模型使用attachEvent和dettachEvent對(duì)事件進(jìn)行綁定和刪除。JavaScript中事件還分捕獲和冒泡兩個(gè)階段,但是傳統(tǒng)綁定只支持冒泡事件。
7、變量
如 var myVariable = "some value";
變量有它的類型,上例中myVariable的類型為string(字符串)
javascript支持的常用類型還有:
object:對(duì)象
array:數(shù)組
number:數(shù)
boolean:布爾值,只有true和false兩個(gè)值,是所有類型中占用內(nèi)存最少的
null:一個(gè)空值,唯一的值是null
undefined:沒(méi)有定義和賦值的變量
實(shí)際上JavaScript的變量是弱變量類型,你賦值給他的是字符串,他就是String .
是數(shù)字他就是整型。是true和false他就是boolean型(注意,不能加引號(hào),不然會(huì)被當(dāng)成字符串處理)。
[2] 編輯本段基本特點(diǎn)
能夠具有交互性,能夠包含更多活躍的元素,就有必要在網(wǎng)頁(yè)中嵌入其它的技術(shù)。如:Javascript、VBScript、Document Object Model(DOM,
文檔對(duì)象模型)、Layers和Cascading Style Sheets(CSS,
層疊樣式表),這里主要講Javascript。那么Javascript是什么東東?Javascript就是適應(yīng)動(dòng)態(tài)
網(wǎng)頁(yè)制作的需要而誕生的一種新的編程語(yǔ)言,如今越來(lái)越廣泛地使用于Internet網(wǎng)頁(yè)制作上。Javascript是由 Netscape公司開(kāi)發(fā)的一種腳本語(yǔ)言(scripting language),或者稱為描述語(yǔ)言。在HTML基礎(chǔ)上,使用Javascript可以開(kāi)發(fā)交互式
Web網(wǎng)頁(yè)。Javascript的出現(xiàn)使得網(wǎng)頁(yè)和用戶之間實(shí)現(xiàn)了一種實(shí)時(shí)性的、動(dòng)態(tài)的、交互性的關(guān)系,使網(wǎng)頁(yè)包含更多活躍的元素和更加精彩的內(nèi)容。運(yùn)行用Javascript編寫的程序需要能支持Javascript語(yǔ)言的瀏覽器。Netscape公司 Navigator 3.0以上版本的瀏覽器都能支持Javascript程序,
微軟公司Internet Explorer 3.0以上版本的瀏覽器基本上支持Javascript。微軟公司還有自己開(kāi)發(fā)的Javascript,稱為JScript。Javascript和Jscript基本上是相同的,只是在一些細(xì)節(jié)上有出入。 Javascript短小精悍,又是在客戶機(jī)上執(zhí)行的,大大提高了網(wǎng)頁(yè)的瀏覽速度和交互能力。 同時(shí)它又是專門為制作Web網(wǎng)頁(yè)而量身定做的一種簡(jiǎn)單的編程語(yǔ)言。
JavaScript 使網(wǎng)頁(yè)增加互動(dòng)性。JavaScript 使有規(guī)律地重復(fù)的HTML文段簡(jiǎn)化,減少下載時(shí)間。JavaScript 能及時(shí)響應(yīng)用戶的操作,對(duì)提交
表單做即時(shí)的檢查,無(wú)需浪費(fèi)時(shí)間交由CGI 驗(yàn)證。JavaScript 的特點(diǎn)是無(wú)窮無(wú)盡的,只要你有創(chuàng)意。
編輯本段開(kāi)發(fā)工具
在今天網(wǎng)絡(luò)開(kāi)發(fā)方面,JavaScript起了很關(guān)鍵的作用;像jQuery, MooTools, Prototype等等JavaScript框架以及其它JavaScript類庫(kù)讓我們的生活輕松了不少。但是隨著Rich Internet Applications(RIA)的面世及迅速應(yīng)用,書寫更強(qiáng)大,更堅(jiān)實(shí)可靠的JavaScript的需要日益迫切。
javascript程序是純文本的,且不需要編譯,所以任何純文本的
編輯器都可以編輯javascript文件。
測(cè)試
JSLint –JavaScript的驗(yàn)證器
JSLint取得一個(gè)JavaScript源代碼并對(duì)其掃描。如果發(fā)現(xiàn)問(wèn)題,它送回信息描述問(wèn)題狀況及在源代碼中的大概位置。問(wèn)題不一定就出在句法上,不過(guò)常常正是這里出錯(cuò)。JSLint查看一些風(fēng)格約定和結(jié)構(gòu)問(wèn)題,它證明不了程序是否正確。它只是提供了另一雙眼睛來(lái)幫助發(fā)現(xiàn)問(wèn)題。
JsUnit
JsUnit是一個(gè)客戶端(內(nèi)瀏覽器)JavaScript單元測(cè)試框架。它其實(shí)是JUnit給JavaScript的一個(gè)口岸。其中還有一個(gè)平臺(tái)來(lái)在多個(gè)瀏覽器上以及運(yùn)行不同操作系統(tǒng)的多個(gè)機(jī)器上的自動(dòng)執(zhí)行測(cè)試。
YUI Test
YUI Test是一個(gè)測(cè)試框架,它針對(duì)基于瀏覽器的JavaScript解決方案。你可以用YUI Test在JavaScript 解決方案上輕松添加單元測(cè)試。
Obtrusive JavaScript Checker
可作為Firefox擴(kuò)展,Greasemonkey用戶腳本,以及Ubiquity命令;Obtrusive JavaScript Checker是一種可以掃過(guò)頁(yè)面上所有元素的工具,發(fā)現(xiàn)帶有行內(nèi)事件的HTML元素(這是有危害性的,JavaScript應(yīng)該是不張揚(yáng)的)時(shí),它給這部分加紅邊使其凸顯?!?
Crosscheck
Crosscheck是一個(gè)開(kāi)源測(cè)試框架,驗(yàn)證內(nèi)瀏覽器JavaScript代碼。它幫助你確保代碼可以在Internet Explorer和Firefox等種種不同的瀏覽器上運(yùn)行,而這些瀏覽器都不需要安裝。
JSLitmus
JSLitmus是一個(gè)輕量級(jí)工具用來(lái)制作JavaScript的特定標(biāo)準(zhǔn)測(cè)試。
JavaScriptMVC的測(cè)試插件
JavaScriptMVC的測(cè)試庫(kù)提供事件模擬,單元測(cè)試,Ajax 夾具,和一個(gè)控制臺(tái)程序。
調(diào)試
Javascript調(diào)試工具包
JavaScript調(diào)試工具包是一種跨瀏覽器調(diào)試JavaScript的eclipse plugin,它可以在IE,Firefox,Safari,Chrome,Opera甚至是移動(dòng)瀏覽器上調(diào)試JavaScript。
Firebug
作為最受歡迎的網(wǎng)頁(yè)開(kāi)發(fā)程序工具,F(xiàn)irebug是Firefox的一個(gè)插件,可以用它在任何網(wǎng)頁(yè)上現(xiàn)時(shí)編輯,調(diào)試和監(jiān)控CSS, HTML, 和JavaScript。它提供給JavaScript登陸和調(diào)試控制臺(tái)一些有用的功能如AJAX requests logging,JavaScript解釋器,DOM explorer等等。Firebug Lite 可以在IE, Opera, 和Safari上使用。
Venkman
Venkman為基于Gecko的瀏覽器提供功能強(qiáng)大JavaScript調(diào)試環(huán)境。這個(gè)調(diào)試器以Firefox & Mozilla插件的形式使用??梢栽谟脩艚缑嫔虾涂刂婆_(tái)命令中使用
斷點(diǎn)管理,調(diào)用棧檢查,變量/對(duì)象檢查等功能,可以讓你以最習(xí)慣的方式調(diào)試。
NitobiBug
NitobiBug是一種基于瀏覽器的JavaScript對(duì)象記錄和檢查工具——與Firebug作用相似。NitobiBug在可以在不同的服務(wù)器(IE6+, Safari, Opera, Firefox)上運(yùn)行以提供開(kāi)發(fā)各種Ajax應(yīng)用程序一致且功能強(qiáng)大的工具。
DamnIT
DamnIT是一種免費(fèi)服務(wù),當(dāng)用戶在網(wǎng)頁(yè)上遇到JavaScript錯(cuò)誤時(shí)它會(huì)給你發(fā)送電子郵件。
JS Bin
JS Bin是一種在線網(wǎng)絡(luò)應(yīng)用程序,為幫助JavaScript開(kāi)發(fā)者在一定情景里測(cè)試代碼片段以及協(xié)作調(diào)試代碼而特別設(shè)計(jì)。你可以用JS Bin在線編輯測(cè)試JavaScript和HTML代碼。一旦完成,你可以將URL保存并發(fā)送給同伴來(lái)進(jìn)行審查或獲得幫助。
Blackbird
許多JavaScript開(kāi)發(fā)者僅僅使用alert()來(lái)顯示各種信息調(diào)試代碼。Blackbird在JavaScript上提供了記錄信息的簡(jiǎn)單方式以及一個(gè)引人注意的控制臺(tái)程序來(lái)察看并過(guò)濾信息。
HTTP監(jiān)控
Fiddler
Fiddler是一種Web調(diào)試代理,它記錄你的電腦和網(wǎng)絡(luò)之間所有的HTTP(S)流量??梢杂肍iddler檢查所有HTTP(S)流量,設(shè)置斷點(diǎn),干涉進(jìn)來(lái)或出去的數(shù)據(jù)。
TamperData
TamperData是一個(gè)追蹤并修改http/https請(qǐng)求的Firefox擴(kuò)展??梢杂盟龌诰W(wǎng)絡(luò)的應(yīng)用程序的安全測(cè)試,追蹤請(qǐng)求/回應(yīng)。
Live HTTP Headers
可以在瀏覽的時(shí)候查看網(wǎng)頁(yè)的HTTP headers??梢杂肔ive HTTP Headers調(diào)試網(wǎng)頁(yè)應(yīng)用程序,找出遠(yuǎn)端網(wǎng)站使用的是那種網(wǎng)站服務(wù)器,或者查看遠(yuǎn)端網(wǎng)站發(fā)送的小數(shù)據(jù)文件。
文件
jGrouseDoc
jGrouseDoc可以從源代碼中的注釋生成API文件。你可以用這個(gè)工具記載你需要的所有構(gòu)造——不僅有函數(shù)和變量,還有類文件包,界面,命名空間,包和其它。使用那種JavaScript框架是無(wú)關(guān)緊要的——你可以不采取框架或工具強(qiáng)加的方式而以自己希望的方式記錄代碼,
JSDoc Toolkit
JavaScript的一種文件產(chǎn)生器,以JavaScript形式寫成;它自動(dòng)從加注的JavaScript源代碼中生成格式模版化,多頁(yè)面HTML(或XML, JSON, 抑或其它文本)。
壓縮
Online Javascript Compression Tool
一個(gè)可以用一些壓縮算法如JSMin 和Packer壓縮JavaScript文件的在線JavaScript壓縮器。壓縮的JavaScript文件是生產(chǎn)環(huán)境中的理想文件,因?yàn)樗鼈兂3⑽募笮p小30-90%。在很大程度上,文件尺寸的縮小是通過(guò)除去網(wǎng)頁(yè)瀏覽者或訪問(wèn)者不需要的注釋和多余的空格字符來(lái)實(shí)現(xiàn)的。
Scriptalizer
一個(gè)將多個(gè)JavaScript文件組合為一個(gè)文件的在線工具。
Dojo ShrinkSafe
一種命令行實(shí)用程序,允許你用瀏覽器縮小文件大小,從而縮短響應(yīng)時(shí)間。Dojo壓縮器不是建立在脆弱的規(guī)則表達(dá)式基礎(chǔ)上的。它基于來(lái)自莫茲拉專案的JavaScript引擎。由于一個(gè)基于真正的parse stream,Dojo壓縮器比基于規(guī)則表達(dá)式的工具可以更好體現(xiàn)代符(變量名等等)的環(huán)境。
YUI Compressor
The YUI Compressor是一種JavaScript壓縮器。去除注釋和空格之外,它還可以用最小可用變量名混淆局部變量。即使在使用‘eval’或‘with’之類構(gòu)造(在這些情況下壓縮并不合適),這種混淆也是安全的。與jsmin相比,它平均節(jié)省20%。
格式化
JavaScript代碼美化工具
這個(gè)美化工具可處理散亂或壓縮的JavaScript代碼,不斷對(duì)其進(jìn)行快速的格式化并使其可讀。
編輯程序&集成開(kāi)發(fā)環(huán)境
Aptana Studio
Aptana Studio是一個(gè)完整的網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境。它提供有JavaScript代碼自動(dòng)完成和調(diào)試,HTML/CSS/JavaScript代碼提示,以及對(duì)重要的Ajax類庫(kù)的支持。Aptana Studio甚至給你頁(yè)面上所有的,包括你自己的JavaScript提供代碼提示。
Komodo Edit
Komodo Edit是一種免費(fèi)開(kāi)放的源編輯程序。它提供自動(dòng)完成,調(diào)用提示,多種語(yǔ)言支持,語(yǔ)法高亮顏色顯示,語(yǔ)法檢查,Vi emulation,Emacs快捷鍵綁定等等功能。擴(kuò)展Komodo Edit是其最實(shí)用的功能之一。你會(huì)發(fā)現(xiàn)各種對(duì)JavaScript開(kāi)發(fā)者有用的擴(kuò)展(如JSLint plugin for Komodo, Venkman JavaScript Debugger,等等)。
Spket IDE
Spket IDE是JavaScript和XML開(kāi)發(fā)功能強(qiáng)大的工具包。JavaScript, XUL/XBL and Yahoo! Widget開(kāi)發(fā)功能強(qiáng)大的編輯器。JavaScript編輯器有代碼完成,語(yǔ)法高亮顯示和內(nèi)容概要等功能,這些功能幫助開(kāi)發(fā)者高效制作出有效的JavaScript代碼。Spket IDE為非商業(yè)用途免費(fèi)提供。
其它工具
Google的AJAX APIs Playground
AJAX API Playground裝載有Google JavaScript APIs(Maps, Search, Feeds, Calendar, Visualization, Language, Blogger, Libraries和Earth,等等)例子,你可以編輯運(yùn)行這些例子幫助你探究Google的APIs可提供的功能。同時(shí)也還有保存和輸出功能。你可以用保存功能保持編輯的例子以留待以后使用。而輸出功能可用來(lái)修改例子并把代碼公布在一個(gè)永久的URL上。
QuirksMode –相容性表
檢查CSS2, CSS3, DOM Core, DOM HTML, DOM CSS, DOM Events 和CSS Object Model View主要瀏覽器相容性狀態(tài)的最受歡迎的出處。
HTML到JavaScript轉(zhuǎn)換器
HTML到JavaScript轉(zhuǎn)換器獲得置標(biāo)并將它轉(zhuǎn)換成一系列可以在JavaScript塊中使用的document.write()申明。
Glimmer
Glimmer是一種
桌面應(yīng)用軟件,可以用它利用jQuery庫(kù)的作用在網(wǎng)頁(yè)上輕松制作交互式元素。可以用它輕松制作交錯(cuò)感受如旋轉(zhuǎn)相冊(cè)/報(bào)頭,下拉導(dǎo)航,懸停效果,或自定義動(dòng)畫。
jQuery Function Builder
你可以用這個(gè)工具很快建立一個(gè)函數(shù)集,當(dāng)頁(yè)面加載完畢/準(zhǔn)備完畢時(shí),調(diào)用該函數(shù)集。
JavaScript Regex Generator
一個(gè)制作
正則表達(dá)式的在線工具。
其它瀏覽器擴(kuò)展
Firefox, Flock & Seamonkey的網(wǎng)絡(luò)開(kāi)發(fā)人員擴(kuò)展
網(wǎng)絡(luò)開(kāi)發(fā)人員拓展在瀏覽器中增加了一個(gè)菜單和工具條,其中包含許多網(wǎng)絡(luò)開(kāi)發(fā)工具包括能使你的XHTML生效,發(fā)現(xiàn)JavaScript/CSS的錯(cuò)誤,網(wǎng)頁(yè)結(jié)構(gòu)可視化,測(cè)試網(wǎng)絡(luò)表單,改變運(yùn)行中的XHTML,檢查HTTP頭信息等等。
Opera Dragonfly
Opera Dragonfly 是Opera瀏覽器的跨設(shè)備,跨平臺(tái)調(diào)試環(huán)境—調(diào)試JavaScript, 檢查編輯CSS和DOM,并且查看移動(dòng)設(shè)備或計(jì)算機(jī)上的錯(cuò)誤。
IE6/7的開(kāi)發(fā)者工具條
微軟的英特網(wǎng)瀏覽器開(kāi)發(fā)者工具條為網(wǎng)頁(yè)的快速創(chuàng)建,理解和故障診斷提供了各種的工具。
Javascript加入網(wǎng)頁(yè)有兩種方法:直接方式和引用方式。
直接方式
這是最常用的方法,大部分含有Javascript的網(wǎng)頁(yè)都采用這種方法,如:
<script type="application/javascript">
<!--
document.write("這是Javascript!采用直接插入的方法!");
//-Javascript結(jié)束-->
</script>
在這個(gè)例子中,我們可看到一個(gè)新的標(biāo)簽:<script>……</script>,而<script language="Javascript"> 用來(lái)告訴瀏覽器這是用Javascript編寫的程序,需要調(diào)動(dòng)相應(yīng)的
解釋程序進(jìn)行解釋。(w3c已經(jīng)建議使用新的標(biāo)準(zhǔn):<script type="application/javascript">)
HTML的注釋標(biāo)簽<!--和-->:用來(lái)去掉瀏覽器所不能識(shí)別的Javascript
源代碼的,這對(duì)不支持Javascript 語(yǔ)言的瀏覽器來(lái)說(shuō)是很有用的。
注意在非xhtml文檔中插入script標(biāo)簽時(shí),如果不是引用外部文件,應(yīng)該在script內(nèi)加上cdata聲明,避免大于和小于運(yùn)算符引起的瀏覽器解析錯(cuò)誤
//-Javascript結(jié)束:雙斜杠表示Javascript的注釋部分,即從//開(kāi)始到行尾的字符都被忽略。 至于程序中所用到的document.write()函數(shù)則表示將括號(hào)中的文字輸出到窗口中去,這在后面將會(huì)詳細(xì)介紹。 另外一點(diǎn)需要注意的是,<script>……</script>的位置并不是固定的,可以包含在<head>……</head> 或<body>…..</body>中的任何地方。
還有一個(gè)更高級(jí)版本的嵌入
腳本,它使用了HTML中的CDATA語(yǔ)法(Character Data,就是把CDATA中的文本全部當(dāng)作純文本處理,除非遇到CDATA的結(jié)束)
<script language="javascript" type="text/javascript"><!--//--><!CDATA[[//><!--
//javascript代碼
//--><!]]></script>
引用方式
如果已經(jīng)存在一個(gè)Javascript源文件(通常以js為擴(kuò)展名),則可以采用這種引用的方式,以提高程序代碼的利用率。其基本格式如下:
<script src=“url” type="text/javascript"></script>
其中的Url就是
程序文件的地址。同樣的,這樣的語(yǔ)句可以放在HTML文檔頭部或主體的任何部分。如果要實(shí)現(xiàn)“直接插入方式”中所舉例子的效果,可以首先創(chuàng)建一個(gè)Javascript源代碼文件“Script.js”,其內(nèi)容如下:
document.write("這是Javascript!采用直接插入的方法!");
在網(wǎng)頁(yè)中可以這樣調(diào)用程序:<script src="Script.js" type="text/javascript"></script> 。
也可以同時(shí)在導(dǎo)入文件時(shí)制定javascript的版本,例如:<script src="Script.js" type="text/javascript; version=1.8"></script>
注意:凡是指定了src屬性的script標(biāo)簽里的內(nèi)容都會(huì)被忽略。
腳本的調(diào)試
隨著用JavaScript編程的深入,你會(huì)開(kāi)始理解那些JavaScript給出的不透明
錯(cuò)誤信息。一旦你理解了你常犯的一般性錯(cuò)誤,你就會(huì)很快知道怎樣避免它們,這樣你寫的代碼中的錯(cuò)誤將越來(lái)越少。編程實(shí)際上是一種能隨著時(shí)間不斷飛快進(jìn)步的技術(shù)。但是不管變得多么熟練,你仍然要花一些時(shí)間調(diào)試你的代碼。如果你做過(guò)家庭作業(yè),或有過(guò)JavaScript編程經(jīng)驗(yàn),你會(huì)知道相當(dāng)多的時(shí)間是花在調(diào)試上。這很正常- 這只是編程者必須做的事之一。實(shí)際上,按照大量的研究,程序員平均百分之五十的時(shí)間花在解決代碼中的錯(cuò)誤。
調(diào)試的技巧: 根據(jù)瀏覽器的提示信息 選擇瀏覽器是很重要的,不同的瀏覽器的錯(cuò)誤提示都不同,在瀏覽器中錯(cuò)誤信息最容易理解的,能最快找出錯(cuò)誤的,就是firefox和opera了。它們都會(huì)給出詳細(xì)的出錯(cuò)原因和行號(hào)。
使用調(diào)試工具 如果你是Firefox的用戶,那么你可以到添加組件的網(wǎng)頁(yè)中搜索一些用于網(wǎng)頁(yè)開(kāi)發(fā)的組件
推薦:Firebug
一款非常優(yōu)秀的組件,可以指出你的腳本中的錯(cuò)誤,查看DOM樹,查看cookie,ajax通信,并且還有CSS的調(diào)試工具,而且也有不少firebug的擴(kuò)展。
javascript debugger
這是mozilla開(kāi)發(fā)的調(diào)試工具,項(xiàng)目代號(hào)叫venkman,和gecko的javascript解析器無(wú)縫集成,功能非常強(qiáng)大。
清除瀏覽器緩存 有時(shí)瀏覽器會(huì)在網(wǎng)頁(yè)明明修改過(guò)的時(shí)候卻依然使用緩存里的網(wǎng)頁(yè)來(lái)顯示,這時(shí)最好強(qiáng)制刷新網(wǎng)頁(yè)以重新載入數(shù)據(jù),如果還不行就清除緩存。
輸出變量 如果你使用firebug調(diào)試的話,可以很方便地在腳本里用console.log()來(lái)輸出變量的值,而且幸運(yùn)的是,firebug還會(huì)對(duì)你輸出的變量進(jìn)行解析,在控制臺(tái)里顯示一個(gè)清晰的變量結(jié)構(gòu)
如果你沒(méi)有firebug,那么可以用alert代替,不過(guò)當(dāng)有幾百個(gè)變量輸出時(shí),很可能不得不強(qiáng)行關(guān)閉瀏覽器。在網(wǎng)頁(yè)里專門放置一個(gè)調(diào)試用的div也是一種不錯(cuò)的解決辦法.
編輯本段相關(guān)概念
客戶端腳本語(yǔ)言
不同于
服務(wù)器端腳本語(yǔ)言,例如PHP與ASP,JavaScript是客戶端腳本語(yǔ)言,也就是說(shuō)JavaScript是在用戶的瀏覽器上運(yùn)行,不需要服務(wù)器的支持而可以獨(dú)立運(yùn)行。所以在早期程序員比較青睞于JavaScript以減少對(duì)服務(wù)器的負(fù)擔(dān),而與此同時(shí)也帶來(lái)另一個(gè)問(wèn)題:安全性。而隨著服務(wù)器的強(qiáng)壯,雖然現(xiàn)在的程序員更喜歡運(yùn)行于服務(wù)端的腳本以保證安全,但JavaScript仍然以其跨平臺(tái)、容易上手等優(yōu)勢(shì)大行其道。
JavaScript是一種腳本語(yǔ)言,其源代碼在發(fā)往客戶端運(yùn)行之前不需經(jīng)過(guò)編譯,而是將文本格式的字符代碼發(fā)送給瀏覽器由瀏覽器解釋運(yùn)行。解釋語(yǔ)言的弱點(diǎn)是安全性較差,而且在JavaScript中,如果一條運(yùn)行不了,那么下面的語(yǔ)言也無(wú)法運(yùn)行。而且由于每次重新加載都會(huì)重新解譯,加載后,有些代碼會(huì)延遲至運(yùn)行時(shí)才解譯,甚至?xí)啻谓庾g,所以速度較慢。
與其相對(duì)應(yīng)的是編譯語(yǔ)言,例如Java。Java的源代碼在傳遞到客戶端運(yùn)行之前,必須經(jīng)過(guò)編譯,因而客戶端上必須具有相應(yīng)平臺(tái)上的仿真器或
解釋器,它可以通過(guò)
編譯器或解釋器實(shí)現(xiàn)獨(dú)立于某個(gè)特定的平臺(tái)編譯代碼的束縛。但是它必須在服務(wù)器端進(jìn)行編譯,這樣就拖延了時(shí)間。但因?yàn)橐呀?jīng)封裝,所以能保證安全性。
面向?qū)ο笮?/span>
javascript中并沒(méi)有類的概念,但是javascript使用了一種叫“原型化繼承”的模型,而且javascript中也有
作用域、
閉包、
繼承、
上下文對(duì)象等概念
作用域 作用域是指變量存在的域,在文檔中的javascript腳本的作用域都是window。在javascript,function和let分隔作用域
例如下面這個(gè)作用域的例子:
var myVariable="outside";
function myFunction(){
var myVariable="inside";
alert(myVariable);
}
myFunction();
alert(myVariable);
結(jié)果會(huì)是先彈出內(nèi)容為“inside”的對(duì)話框,然后彈出內(nèi)容為“outside”的對(duì)話框,這就是
function建立了一個(gè)作用域,而第一次提示的是myFunction作用域內(nèi)的myVariable
下面是一個(gè)let控制作用域的例子:
var myVariable="outside";
let(myVarialbe="inside") alert(myVariable); // inside
alert(myVariable); // outside
let語(yǔ)句是在javascript 1.7中加入的
閉包 閉包也和作用域有關(guān),它指的就是一個(gè)封閉的作用域(擁有外部
變量,函數(shù)無(wú)法訪問(wèn)的變量和
函數(shù)),一般都是用一個(gè)
匿名函數(shù)來(lái)做成閉包的
(function(){
var myVariable="private",
})();
alert(myVariable); // undefined
上下文對(duì)象 上下文對(duì)象指的就是this對(duì)象。它是一個(gè)只能讀取而不能直接賦值的對(duì)象(就是你只能對(duì)this擁有的屬性和方法賦值)。上下文對(duì)象在javascript可以說(shuō)發(fā)揮的淋漓盡致。
如果你在一個(gè)對(duì)象(Object)中使用this,指的就是這個(gè)對(duì)象
var obj={
getThis:function(){
return this;
}
};
alert(obj.getThis===obj); // true
同樣的,在作用域中已經(jīng)提到過(guò)文檔中javascript對(duì)象都屬于window,那么下面這個(gè)例子
alert(window===this);
也將提示true。
上下文對(duì)象在事件偵聽(tīng)器中指的就是發(fā)生事件的對(duì)象
document.body.addEventListener('click',function(){
alert(this===document.body); // true
},false);
this在構(gòu)造函數(shù)中則是指實(shí)例
function Person(name){
thisname=name;
}
var Sam=new Persom();
這里this指的就是Sam。
Javascript庫(kù)
庫(kù),指得是可以方便應(yīng)用到現(xiàn)有開(kāi)發(fā)體系中的、現(xiàn)成的代碼資源。庫(kù)不僅為大部分日常的DOM腳本編程工作提供了快捷的解決方案,而且也提供了許多獨(dú)特的工具。雖然庫(kù)使用起來(lái)很方便,但它們也并非能解決你所有的問(wèn)題。在使用庫(kù)之前,一定要保證真正理解javascript的DOM原理。
這些庫(kù)一般是一個(gè)(或多個(gè))js(Javascript的縮寫)文件,只要把他們導(dǎo)入你的網(wǎng)頁(yè)就能使用了。
常用的庫(kù)有:
jQuery:javascript庫(kù)中的新成員,提供
css和
xpath選擇符查找元素、
ajax、動(dòng)畫效果等
JSer:
[3]國(guó)人開(kāi)發(fā)的一款全功能的開(kāi)源腳本框架. 借助JSer,可以便捷的操作DOM、CSS樣式訪問(wèn)、屬性讀寫、事件綁定、行為切換、動(dòng)態(tài)載入、
數(shù)據(jù)緩存、URL與AJAX等眾多功能。
dojo:一個(gè)巨大的庫(kù),包括的東西很多,dijit和dojox是dojo的擴(kuò)展,幾乎你想要的各種javascript程序都包括了。
prototype:一個(gè)非常流行的庫(kù),使用了原型鏈向javascript中添加了很多不錯(cuò)的函數(shù)
YUI:(YahooYUI庫(kù))yahoo!用戶界面,非常實(shí)用,提供各種解決方案。
ExtJs:組件非常豐富,皮膚也很漂亮,動(dòng)畫效果也豐富。
與Java的不同
Java之于Javascript就好比Car(汽車)之于Carpet(地毯)。
——來(lái)自Usenet上的Javascript討論組
中國(guó)本地版的說(shuō)法應(yīng)該是這樣的:Java之于JavaScript就好比
雷鋒和雷峰塔的關(guān)系。
很多人看到Java 和JavaScript 都有“Java”四個(gè)字,就以為它們是同一樣?xùn)|西,連我自己當(dāng)初也是這樣。事實(shí)上,JAVA語(yǔ)言和JavaScript語(yǔ)言是相關(guān)的,但是它們的聯(lián)系并非你想像的那樣緊密。首先
Java語(yǔ)言是SUN Microsystems公司的產(chǎn)品,而JavaScript是Netscape公司的產(chǎn)品。
其次它們?cè)诠δ苌弦灿行┎町悾篔ava在客戶端的運(yùn)行的
應(yīng)用程序叫做Java Applet,是嵌在網(wǎng)頁(yè)中,而又有自己獨(dú)立的運(yùn)行窗口的小程序。Java Applet 是預(yù)先編譯好的,一個(gè)Applet 文件(.class)用Notepad 打開(kāi)閱讀,根本不能理解。Java Applet 的功能很強(qiáng)大,可以訪問(wèn)http、ftp等協(xié)議,甚至可以在電腦上種病毒(已有先例了)。相比之下,JavaScript 的能力就比較小了。JavaScript 是一種“腳本”(“Script”),它直接把代碼寫到HTML 文檔中,瀏覽器讀取它們的時(shí)候才進(jìn)行編譯、執(zhí)行,所以能查看HTML 源文件就能查看JavaScript 源代碼。JavaScript 沒(méi)有獨(dú)立的運(yùn)行窗口,瀏覽器當(dāng)前窗口就是它的運(yùn)行窗口。它們的相同點(diǎn),我想只有同是以Java 作編程語(yǔ)言一點(diǎn)了。
Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言和
Java平臺(tái)的總稱。用Java實(shí)現(xiàn)的
HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺(tái)、動(dòng)感的Web、Internet計(jì)算。從此,Java被廣泛接受并推動(dòng)了Web的迅速發(fā)展,常用的瀏覽器現(xiàn)在均支持Java applet。另一方面,Java技術(shù)也不斷更新。
Java平臺(tái)由Java
虛擬機(jī)(Java Virtual Machine)和Java 應(yīng)用編程接口(Application Programming Interface、簡(jiǎn)稱API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個(gè)獨(dú)立于
操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)展部分。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java 應(yīng)用程序就可運(yùn)行。現(xiàn)在Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。
Java分為三個(gè)體系JavaSE、JavaEE、JavaME。
與JScript不同
JScript是Microsoft公司開(kāi)發(fā)的,Javascript是Netscape公司開(kāi)發(fā)的,雖然他們是死對(duì)頭,但是在現(xiàn)在的瀏覽器中,無(wú)論你把語(yǔ)言指定為Javascript 還是Jscript,瀏覽器都會(huì)綜合他們兩個(gè)語(yǔ)言的特性,所以,即使把語(yǔ)言指定為Javascript,用幾句JScript也是沒(méi)問(wèn)題的。
雖然瀏覽器綜合了兩種語(yǔ)言的特性,但是對(duì)于那些對(duì)腳本語(yǔ)言熟悉的程序員來(lái)說(shuō),還是Jscript的實(shí)用性更強(qiáng)。如果你在網(wǎng)上察看Javascript和Jscript的手冊(cè),你會(huì)發(fā)現(xiàn)Jscript的運(yùn)算符比Javascript的多得多,所以許多庫(kù)(比如Concurrent、
Thread)都是采用Jscript的格式編寫的。
其他腳本語(yǔ)言的關(guān)系
Visual Studio 2008之前的版本可以使用
debugger來(lái)調(diào)試。
Javascript不是一個(gè)預(yù)編譯語(yǔ)言,所以雖然Javascript的作者盡量把它寫得強(qiáng)大,但是仍然有一些功能無(wú)法實(shí)現(xiàn),而且對(duì)于那些對(duì)
VBscript熟悉而對(duì)Javascript 卻較陌生的程序員來(lái)說(shuō),這是一個(gè)很頭疼的難題,因?yàn)閂Bscript也只是一門腳本語(yǔ)言,當(dāng)然沒(méi)有VB 強(qiáng)大。
許多瀏覽器(如
IE)都提供了腳本互通,但是網(wǎng)上對(duì)此的介紹不多,最多在應(yīng)用問(wèn)題上提到一點(diǎn)。Javascript和VBscript的互通性很好,而且在VBArray(Javascript不支持多維數(shù)組)和
ASCII(Javascript不能把字符轉(zhuǎn)成ASCII)中都得到了應(yīng)用,這方面基礎(chǔ)VBScript做得很好。所以它的代碼的大致意思就是Javascript可以用VBScript的自定義函數(shù)和變量(當(dāng)然不能用內(nèi)置變量和函數(shù))通過(guò)轉(zhuǎn)換調(diào)用
內(nèi)置函數(shù)。
<script language="vbscript">
function AL()
AL = "S"
end function
</script>
<script language="javascript">
alert(AL());
</script>
至于效果就自己看吧。
與DOM的關(guān)系
DOM是Document Object Model(文檔對(duì)象模型)的簡(jiǎn)稱,它是讓javascript與頁(yè)面交互的一種方式,能夠動(dòng)態(tài)修改文檔中的節(jié)點(diǎn)、元素、屬性等。
DOM不僅適用于
xhtml文檔,對(duì)于所有的xml文檔dom都是可以使用的。
DOM的級(jí)別 1級(jí):基本的節(jié)點(diǎn)操作一級(jí)里都包括了
2級(jí):增加了對(duì)樣式表、文檔顯示、事件處理等的支持
3級(jí):可以用javascript加載和保存文檔、檢查文檔錯(cuò)誤。
進(jìn)階技術(shù)AJAX
AJAX全稱為“
Asynchronous JavaScript and XML”(異步
JavaScript和
XML),是一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。根據(jù)Ajax提出者Jesse James Garrett建議AJAX:
1.使用
XHTML+
CSS來(lái)表示信息
2.使用
JavaScript操作
DOM(
Document Object Model)進(jìn)行動(dòng)態(tài)顯示及交互
3.使用
XML和
XSLT進(jìn)行數(shù)據(jù)交換及相關(guān)操作
4.使用
XMLHttpRequest對(duì)象與
Web服務(wù)器進(jìn)行異步數(shù)據(jù)交換
5.使用JavaScript將所有的東西綁定在一起。
AJAX的應(yīng)用使用支持以上技術(shù)的Web
瀏覽器作為運(yùn)行平臺(tái)。這些瀏覽器目前包括:
Internet Explorer、
Mozilla、
Firefox、
Opera、Konqueror及Mac OS的
Safari。但是
Opera不支持XSL格式對(duì)象,也不支持XSLT。
編寫第一個(gè)JavaScript程序
<html>
<head>
<script type="text/javascript">
<!--
document.
write("Hello, world!")
//直接在瀏覽器視窗顯示。 alert("Hello, world!")
//開(kāi)啟對(duì)話視窗顯示。 -->
</script>
</head>
<body>
</body>
</html>
JavaScript代碼由<script type="text/javaScript">…</script>說(shuō)明。在標(biāo)識(shí)<script type ="text/javaScript">…</script>之間就可加入JavaScript腳本。 alert()是JavaScript的窗口對(duì)象方法,其功能是彈出一個(gè)具有OK對(duì)話框并顯示()中的字符串。通過(guò)<!-- …//-->標(biāo)識(shí)說(shuō)明:若不認(rèn)識(shí)JavaScript代碼的瀏覽器,則所有在其中的標(biāo)識(shí)均被忽略;若認(rèn)識(shí),則執(zhí)行其結(jié)果。使用注釋這是一個(gè)好的編程習(xí)慣,它使其他人可以讀懂你的語(yǔ)言。JavaScript 以</Script> 標(biāo)簽結(jié)束。
提升JavaScript的運(yùn)行速度
遞歸是拖慢腳本運(yùn)行速度的大敵之一。太多的遞歸會(huì)讓瀏覽器變得越來(lái)越慢直到死掉或者莫名其妙的突然自動(dòng)退出(在firefox中彈出腳本無(wú)響應(yīng)的對(duì)話框),所以我們一定要解決在JavaScript中出現(xiàn)的這一系列性能問(wèn)題。在這個(gè)系列文章的第二篇中,我曾經(jīng)簡(jiǎn)短的介紹了如何通過(guò)memorization技術(shù)來(lái)替代函數(shù)中太多的遞歸調(diào)用。memoization是一種可以緩存之前運(yùn)算結(jié)果的技術(shù),這樣我們就不需要重新計(jì)算那些已經(jīng)計(jì)算過(guò)的結(jié)果。對(duì)于通過(guò)遞歸來(lái)進(jìn)行計(jì)算的函數(shù),memoization簡(jiǎn)直是太有用了。我現(xiàn)在使用的memoizer是由Crockford寫的,主要應(yīng)用在那些返回
整數(shù)的遞歸運(yùn)算中。當(dāng)然并不是所有的
遞歸函數(shù)都返回整數(shù),所以我們需要一個(gè)更加通用的memoizer()函數(shù)來(lái)處理更多類型的遞歸函數(shù)。
function memoizer(fundamental, cache){ cache = cache || {} var shell = function(arg){ if (!(arg in cache)){ cache[arg] = fundamental(shell, arg) } return cache[arg]; }; return shell;}這個(gè)版本的函數(shù)和Crockford寫的版本有一點(diǎn)點(diǎn)不同。首先,參數(shù)的順序被顛倒了,原有函數(shù)被設(shè)置為第一個(gè)參數(shù),第二個(gè)參數(shù)是緩存對(duì)象,為可選參數(shù),因?yàn)椴⒉皇撬械倪f歸函數(shù)都包含初始信息。在函數(shù)內(nèi)部,我將緩存對(duì)象的類型從數(shù)組轉(zhuǎn)換為對(duì)象,這樣這個(gè)版本就可以適應(yīng)那些不是返回整數(shù)的遞歸函數(shù)。在
shell函數(shù)里,我使用了in操作符來(lái)判斷參數(shù)是否已經(jīng)包含在緩存里。這種寫法比測(cè)試類型不是undefined更加安全,因?yàn)閡ndefined是一個(gè)有效的返回值。我們還是用之前提到的
斐波納契數(shù)列來(lái)做說(shuō)明:
var fibonacci = memoizer(function (recur, n) { return recur(n - 1) + recur(n - 2); }, {"0":0, "1":1});同樣的,執(zhí)行fibonacci(40)這個(gè)函數(shù),只會(huì)對(duì)原有的
函數(shù)調(diào)用40次,而不是夸張的331,160,280次。memoization對(duì)于那些有著嚴(yán)格定義的結(jié)果集的遞歸算法來(lái)說(shuō),簡(jiǎn)直是棒極了。然而,確實(shí)還有很多遞歸算法不適合使用memoization方法來(lái)進(jìn)行優(yōu)化。
我在學(xué)校時(shí)的一位教授一直堅(jiān)持認(rèn)為,任何使用遞歸的情況,如果有需要,都可以使用迭代來(lái)代替。實(shí)際上,遞歸和迭代經(jīng)常會(huì)被作為互相彌補(bǔ)的方法,尤其是在另外一種出問(wèn)題的情況下。將遞歸算法轉(zhuǎn)換為迭代算法的技術(shù),也是和開(kāi)發(fā)語(yǔ)言無(wú)關(guān)的。這對(duì)JavaScript來(lái)說(shuō)是很重要的,因?yàn)楹芏鄸|西在執(zhí)行環(huán)境中是受到限制的(the importance in JavaScript is greater, though, because the resources of the execution environment are so restrictive.)。讓我們回顧一個(gè)典型的遞歸算法,比如說(shuō)歸并排序,在JavaScript中實(shí)現(xiàn)這個(gè)算法需要下面的代碼:
function merge(left, right){ var result = []; while (left.length > 0 && right.length > 0){ if (left[0] < right[0]){ result.push(left.shift()); } else { result.push(right.shift()); } } return result.concat(left).concat(right);}//采用遞歸實(shí)現(xiàn)的
歸并排序算法function mergeSort(items){ if (items.length == 1) { return items; } var middle = Math.floor(items.length / 2), left = items.slice(0, middle), right = items.slice(middle); return merge(mergeSort(left), mergeSort(right));}調(diào)用mergeSort()函數(shù)處理一個(gè)數(shù)組,就可以返回經(jīng)過(guò)排序的數(shù)組。注意每次調(diào)用mergeSort()函數(shù),都會(huì)有兩次遞歸調(diào)用。這個(gè)算法不可以使用memoization來(lái)進(jìn)行優(yōu)化,因?yàn)槊總€(gè)結(jié)果都只計(jì)算并使用一次,就算緩沖了結(jié)果也沒(méi)有什么用。如果你使用mergeSort()函數(shù)來(lái)處理一個(gè)包含100個(gè)元素的數(shù)組,總共會(huì)有199次調(diào)用。1000個(gè)元素的數(shù)組將會(huì)執(zhí)行1999次調(diào)用。在這種情況下,我們的解決方案是將遞歸算法轉(zhuǎn)換為迭代算法,也就是說(shuō)要引入一些循環(huán)(關(guān)于算法,可以參考這篇《List Processing: Sort Again, Naturally》)。
常用的javascript庫(kù)
jquery庫(kù)、JSer
[3]庫(kù)、prototype
版本 | 發(fā)布日期 | 基于 | Netscape Navigator | Mozilla Firefox | Internet Explorer | Opera | Safari | 谷歌Chrome |
1.0 | 1996年3月 | | 2.0 | | 3.0 | | | |
1.1 | 1996年8月 | | 3.0 | | | | | |
1.2 | 1997年6月 | | 4.0-4.05 | | | | | |
1.3 | 1998年10月 | ECMA-262 1 edition / ECMA-262 2 edition | 4.06-4.7x | | 4.0 | | | |
1.4 | | | Netscape Server | | | | | |
1.5 | 2000年11月 | ECMA-262 3 edition | 6.0 | 1.0 | 5.5 (JScript 5.5), 6.(JScript 5.6), 7.(JScript 5.7), 8.(JScript 6) | 6.0, 7.0, 8.0, 9.0 | | |
1.6 | 2005年11月 | 1.5 + Array extras + Array and String generics + E4X | | 1.5 | | | 3.0, 3.1 | |
1.7 | 2006年10月 | 1.6 + Pythonic generators + Iterators + let | | 2.0 | | | 3.2, 4.0 | 1.0 |
1.8 | 2008年6月 | 1.7 + Generator s + closures | | 3.0 | | | | |
1.8.1 | | 1.8 + Minor Updates | | 3.5 | | | | |
1.9 | | 1.8.1 + ECMAScript 5 Compliance | | 4 | | | | |
編輯本段版本標(biāo)準(zhǔn)
JavaScript已經(jīng)被Netscape公司提交給
ECMA制定為標(biāo)準(zhǔn),稱之為ECMAScript,這個(gè)標(biāo)準(zhǔn)由ECMA
組織發(fā)展和維護(hù),標(biāo)準(zhǔn)編號(hào)ECMA-262。這個(gè)標(biāo)準(zhǔn)基于JavaScript (Netscape) 和JScript (Microsoft)。Netscape (Navigator 2.0) 的
Brendan Eich發(fā)明了這門語(yǔ)言,從1996 年開(kāi)始,已經(jīng)出現(xiàn)在所有的Netscape 和Microsoft
瀏覽器中。ECMA-262 的開(kāi)發(fā)始于1996 年,在1997 年7 月,ECMA 會(huì)員大會(huì)采納了它的首個(gè)版本。
在1998 年,該標(biāo)準(zhǔn)成為了國(guó)際ISO 標(biāo)準(zhǔn)(ISO/IEC 16262)。這個(gè)標(biāo)準(zhǔn)仍然處于發(fā)展之中。在2005年12月,ECMA發(fā)布ECMA-357標(biāo)準(zhǔn)(ISO/IEC 22537)出臺(tái),主要增加對(duì)擴(kuò)展標(biāo)記語(yǔ)言
XML的有效支持。目前最新版為ECMA-262 3rd Edition。符合該標(biāo)準(zhǔn)的實(shí)現(xiàn)有:
1. Microsoft公司的JScript
2. Mozilla的Javascript-C(C語(yǔ)言實(shí)現(xiàn))
3. SpiderMonkeyMozilla的Rhino(Java實(shí)現(xiàn))
4. Digital Mars公司的DMDScript
5. 谷歌公司的V8WebKit
目前ECMA-262 4th Edition正在開(kāi)發(fā)的過(guò)程中,與其對(duì)應(yīng)的JavaScript的版本為JavaScript 2.0,目前也正在開(kāi)發(fā)過(guò)程中。
大概在1998年,一家稱作Nombas的公司開(kāi)始開(kāi)發(fā)一種叫做C減減(C-minus-minus,簡(jiǎn)稱Cmm)的嵌入式腳本語(yǔ)言。這個(gè)腳本語(yǔ)言捆綁在一個(gè)叫做CEnvi的共享軟件產(chǎn)品中,當(dāng)Netscape Navigator嶄露頭角時(shí),Nombas開(kāi)發(fā)了一個(gè)可以嵌入網(wǎng)頁(yè)中的CEnvi的版本。這些早期的試驗(yàn)稱為EspressoPage(濃咖啡般的頁(yè)面),它們代表了第一個(gè)在
萬(wàn)維網(wǎng)上使用的
客戶端腳本語(yǔ)言。而Nombas絲毫沒(méi)有料到它的理念將會(huì)成為
因特網(wǎng)的一塊重要基石。
編輯本段常見(jiàn)問(wèn)題(FQA)
JavaScript是Java的變種嗎
JavaScript最初的確是受Java啟發(fā)而開(kāi)始設(shè)計(jì)的,而且設(shè)計(jì)的目的之一就是“看上去像Java”[2],因此語(yǔ)法上有很多類似之處,許多名稱和命名規(guī)范也借自Java。但是實(shí)際上,JavaScript的主要設(shè)計(jì)原則源自Self和Scheme[3],它與Java本質(zhì)上是不同的。它與Java名稱上的近似,是當(dāng)時(shí)網(wǎng)景為了營(yíng)銷考慮與Sun公司達(dá)成協(xié)議的結(jié)果。其實(shí)從本質(zhì)上講javascript更像是一門函數(shù)式編程語(yǔ)言.而非
面向?qū)ο?/a>的語(yǔ)言,它使用一些智能的語(yǔ)法和語(yǔ)義來(lái)仿真高度復(fù)雜的行為。其對(duì)象模型極為靈活、開(kāi)放和強(qiáng)大,具有全部的反射性。 JavaScript與JScript相同嗎?
為了取得技術(shù)優(yōu)勢(shì),微軟推出了JScript來(lái)迎戰(zhàn)JavaScript的腳本語(yǔ)言。為了互用性,Ecma國(guó)際(前身為
歐洲計(jì)算機(jī)制造商協(xié)會(huì))建立了ECMA-262標(biāo)準(zhǔn)(ECMAScript)?,F(xiàn)在兩者都屬于ECMAScript的實(shí)現(xiàn)。
JavaScript是一門簡(jiǎn)單的語(yǔ)言嗎?
盡管JavaScript作為給非
程序人員的腳本語(yǔ)言,而非作為給程序人員的編程語(yǔ)言來(lái)推廣和宣傳,但是JavaScript是一門具有非常豐富特性的語(yǔ)言,它有著和其他編程語(yǔ)言一樣的復(fù)雜性,或更甚復(fù)雜。實(shí)際上,你必需對(duì)JavaScript有扎實(shí)的理解才能用它來(lái)撰寫比較復(fù)雜的程序。
編輯本段基于JavaScript框架
Jquery
Jquery是繼prototype之后又一個(gè)優(yōu)秀的Javascrīpt
框架。它是輕量級(jí)的js庫(kù)(壓縮后只有21k) ,它兼容CSS3,還兼容各種
瀏覽器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用戶能更方便地處理HTML documents、events、實(shí)現(xiàn)動(dòng)畫效果,并且方便地為網(wǎng)站提供AJAX交互。jQuery還有一個(gè)比較大的優(yōu)勢(shì)是,它的文檔說(shuō)明很全,而且各種應(yīng)用也說(shuō)得很詳細(xì),同時(shí)還有許多成熟的
插件可供選擇。jQuery能夠使用戶的html頁(yè)保持代碼和html內(nèi)容分離,也就是說(shuō),不用再在html里面插入一堆js來(lái)調(diào)用命令了,只需定義id即可。
Ext
Ext是一個(gè)強(qiáng)大的js類庫(kù),以前是基于
YAHOO-UI,現(xiàn)在已經(jīng)完全獨(dú)立了。 主要包括data、widget、form、grid、dd、menu,其中最強(qiáng)大的應(yīng)該算grid了,編程思想是基于
面向?qū)ο缶幊?/a>(oop),擴(kuò)展性相當(dāng)?shù)暮?可以自己寫擴(kuò)展,自己定義命名空間。web應(yīng)用可能感覺(jué)太大.不過(guò)您可以根據(jù)需要按需加載您想要的類庫(kù)就可以了?!? 主要包括三個(gè)大的文件:ext-all.css,ext-base.js,ext-all.js(包括所有的類庫(kù),您可以根據(jù)需要進(jìn)行刪減.官方網(wǎng)站提供這一接口),在引用ext類庫(kù)的時(shí)候,這三個(gè)文件必不可少?!? 它提供了豐富的,非常漂亮的外觀體驗(yàn),成為眾多界面層開(kāi)發(fā)人員的追捧!其核心的組件基本覆蓋了我們構(gòu)建富客戶端的常用的組件?!?
從 Ext 2開(kāi)始,商業(yè)版(針對(duì)那些以盈利為目的的開(kāi)發(fā)方)要收費(fèi)了。這可能會(huì)影響一些他的應(yīng)用前景?!?
目前的最新版本為4.0
prototype
prototype.js是由Sam Stephenson寫的一個(gè)javascript類庫(kù)。該框架的設(shè)計(jì)思路巧妙,而且兼容標(biāo)準(zhǔn)的類庫(kù),能夠幫助開(kāi)發(fā)人員輕松建立有交互性良好的web2.0特性
富客戶端頁(yè)面。