JS
?js是一種基于對象和事件驅動的并具有相對安全性的客戶端腳本語言蓬网。也是一種廣泛用于web客戶端開發(fā)的腳本語言,常用來給html網(wǎng)頁添加動態(tài)功能,如響應用戶的各種操作型将。
js的數(shù)據(jù)類型有:
? 基本數(shù)據(jù)類型:String、boolean荐虐、Number七兜、undefined、null? ? ? ? 引用數(shù)據(jù)類型:Object福扬、Array腕铸、Date、RegExp忧换、Function
如何判斷數(shù)組數(shù)據(jù)類型:
[if !supportLists]1恬惯、[endif]通過專有方法判斷如:push(),pop();(可自己給變量定義該方法,有時失效)? ? ? ? ? ? ? ? 2亚茬、 obj instanceof Array 返回值判斷酪耳;? ?
? ??? ? ? ? ? ? ? ? 3、es5和jquery都有方法Array.isArray()刹缝。? ? ? ? ? ? ? ? 4碗暗、toString.call(param) 判斷;返回格式 [object
Undefined]? ? ? ? ? ? ? ? 5梢夯、obj.constructor === Function 返回值判斷
js事件流:
“事件冒泡”:事件由最具體的元素接收言疗,然后逐級向上傳播;? ? ?“事件捕捉”:事件由最不具體的節(jié)點先接收颂砸,然后逐級向下噪奄,一直到最具體元素死姚;?
? ?“dom事件流”:三個階段:事件捕捉,目標階段勤篮,事件冒泡都毒;
什么是Ajax和JSON,它們的優(yōu)缺點:
? Ajax(Asynchronous Javascript And XML/異步的javascript和xml)碰缔。
優(yōu)點: 可以使得頁面不重載全部內(nèi)容的情況下加載局部內(nèi)容账劲,降低數(shù)據(jù)傳輸量。避免用戶不斷刷新或者跳轉頁面金抡,提高用戶體驗瀑焦。
?缺點: 對搜索引擎不友好。要實現(xiàn)ajax下的前后退功能成本較大梗肝¢晃停可能造成請求數(shù)的增加⊥炒罚跨域問題限制榆芦。
JSON:json是一種輕量級的數(shù)據(jù)交換格式,ECMA(歐洲計算機制造商協(xié)會)的一個子集喘鸟;
?優(yōu)點:輕量級匆绣,占用帶寬小、易于人的閱讀和編寫什黑,便于機器(js)解析崎淳,支持復合數(shù)據(jù)類型(數(shù)組,對象愕把,字符串拣凹,數(shù)字),能直接為服務器端代碼使用恨豁,大大簡化了服務器端和客戶端的代碼開發(fā)量嚣镜。
?缺點:相對xml通用性較差,數(shù)據(jù)可描述性較差橘蜜;
什么情況會出現(xiàn)undefined:當只聲明變量菊匿,并未賦值初始化的時候這個變量的值就是undefined例如:console.log(a);var a = 10
null是一個只有一個值的數(shù)據(jù)類型,這個值就是null计福。表示一個空指針對象跌捆。所以typeof返回object
雙等號的類型轉換:
var undefined;? ? ? ? undefined ==null; // true
1 == true;??// true
2 == true;??// false
0 == false; // true
0 == '';? ?// true
NaN == NaN; // false
[] == false; // true
[] == ![];??// true
alert(!![])? ? ? ? //true?alert(![])?? ? ? //false
alert([] == 0)? ? ? ? //true
alert(false == 0)? ? ? ? //true
undefined與null但不全等(===)
當為number與string時,會將string轉換為number象颖;
number和boolean時佩厚,會將boolean轉換為number
number或string與Object,會將Object轉換成number或string
js中的數(shù)據(jù)類型轉換
函數(shù)轉換:parseInt()说订、parseFloat()抄瓦、toString()
強類型轉換:Boolean()潮瓶、Number()、String()
弱類型轉換:“==”闺鲸、“-”筋讨、“+”、if()
dom增刪查改:
增:document.createElement(tag);
document.createTextNode();
document.createDocumentFragment();
dom.appendChild(sondom);
dom.insertBefore(newdom,targetdom);
刪:document.removeChild();
改:document.replaceChild();
查:getElementById();getElementsByTagName();getElementsByName();
閉包是什么:
閉包(closure)是javascript的一大難點摸恍,也是它的特色。很多高級應用都要依靠閉包來實現(xiàn)赤屋。
1立镶、變量作用域
要理解閉包,首先要理解javascript的特殊的變量作用域类早。
變量的作用域無非就兩種:全局變量和局部變量媚媒。
javascript語言的特別之處就在于:函數(shù)內(nèi)部可以直接讀取全局變量,但是在函數(shù)外部無法讀取函數(shù)內(nèi)部的局部變量涩僻。
注意點:在函數(shù)內(nèi)部聲明變量的時候缭召,一定要使用var命令。如果不用的話逆日,你實際上聲明的是一個全局變量嵌巷!
2、如何從外部讀取函數(shù)內(nèi)部的局部變量室抽?
出于種種原因搪哪,我們有時候需要獲取到函數(shù)內(nèi)部的局部變量。但是坪圾,上面已經(jīng)說過了晓折,正常情況下,這是辦不到的兽泄!只有通過變通的方法才能實現(xiàn)漓概。
那就是在函數(shù)內(nèi)部,再定義一個函數(shù)病梢。
3胃珍、閉包的概念
上面代碼中的f2函數(shù),就是閉包飘千。
各種專業(yè)文獻的閉包定義都非常抽象堂鲜,我的理解是:?閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
由于在javascript中护奈,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量缔莲,所以說,閉包可以簡單理解成“定義在一個函數(shù)內(nèi)部的函數(shù)“霉旗。
所以痴奏,在本質上蛀骇,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁瞳氓。
?4夺颤、閉包的用途
閉包可以用在許多地方。它的最大用處有兩個倍阐,一個是前面提到的可以讀取函數(shù)內(nèi)部的變量檐晕,另一個就是讓這些變量的值始終保持在內(nèi)存中暑诸,不會在f1調(diào)用后被自動清除。
為什么會這樣呢辟灰?原因就在于f1是f2的父函數(shù)个榕,而f2被賦給了一個全局變量,這導致f2始終在內(nèi)存中芥喇,而f2的存在依賴于f1西采,因此f1也始終在內(nèi)存中,不會在調(diào)用結束后继控,被垃圾回收機制(garbage
collection)回收械馆。
這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行武通,首先在nAdd前面沒有使用var關鍵字霹崎,因此nAdd是一個全局變量,而不是局部變量厅须。其次仿畸,nAdd的值是一個匿名函數(shù)(anonymous function),而這個匿名函數(shù)本身也是一個閉包朗和,所以nAdd相當于是一個setter错沽,可以在函數(shù)外部對函數(shù)內(nèi)部的局部變量進行操作。
5眶拉、使用閉包的注意點
(1)由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中千埃,內(nèi)存消耗很大,所以不能濫用閉包忆植,否則會造成網(wǎng)頁的性能問題放可,在IE中可能導致內(nèi)存泄露。解決方法是朝刊,在退出函數(shù)之前耀里,將不使用的局部變量全部刪除。
(2)閉包會在父函數(shù)外部拾氓,改變父函數(shù)內(nèi)部變量的值冯挎。所以,如果你把父函數(shù)當作對象(object)使用咙鞍,把閉包當作它的公用方法(Public Method)房官,把內(nèi)部變量當作它的私有屬性(private value)趾徽,這時一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值翰守。