1.構造對象的幾種方法:
工廠方法
1.functiona(){varchild=newObject();? ? child.name="ding";? ? child.age=21;returnchild;}varx=a();
構造函數方法
2.functiona(){this.name="ding";this.age=21;}varx=a();
原型 方法
3.functiona(){}a.prototype.name="ding";a.prototype.age=21;varx=a();
混合 方法
4.functiona(){this.name="ding";}a.prototype.age=21;
2.閉包:
vara=function(){vari=0;returnfunctionb(){? ? ? ? alert(++i);? ? }}varc=a();c();c();
這就是一個典型的閉包,外層一個函數,內部還是函數,然后將內部函數return出去。
其中最重要是var c=a();c();這兩句話。
var c=a();執行后返回的是b函數,因為已經return了,所以系統回收變量,這樣下來b函數就沒有釋放。
c();這個執行的就是b函數。因為沒有return,所以就不會釋放,一直在棧區。這就實現了全局的效果。
安全性,全局性。
好處呢:1.安全性,上面的函數a中的i,只有b可以訪問,保護了變量的安全。
2.全局性,因為b函數沒有釋放,還在棧區,達到全局的目的。
3.使用JS改變元素的class
functionchangeClass(oldClass,newClass){varEles=document.getElementsByTagName('*');for(vari=0;i
4.判斷類型
判斷一個對象為undefined
if(typeofobj=="undefined"){varobg={};}
判斷一個對象為null或者undefined
if(obj==null){? ? alert("is null or undefined");}
判斷一個對象為null
if(obj===null){? ? alert("is null");}
判斷一個對象是不是數組
functionisArray(obj){returnObject.prototype.toString.call(obj)=== '[objectArray]';}
補充:
undefined==unll(這個是對的)
undefined===unll(這個是錯的)
(==與===的區別:前者比較的只是數值后者比較的除了數值還有類型。前者可以自動轉換數據類型,后者不可以)
5.普通事件與綁定事件的區別:
例如:
varbtn=document.getElementById("btn");? ? 普通事件:? ? btn.onclick=function(){? ? ? ? alert("普通事件1");? ? }// 結果是不執行btn.onclick=function(){? ? ? ? alert("普通事件2");? ? }// 結果是執行綁定事件:? ? btn.addEventListener('click',function(){? ? ? ? alert("綁定事件1");? ? },false);// 結果是執行btn.addEventListener('click',function(){? ? ? ? alert("綁定事件2");? ? },false);// 結果是執行
所以說區別就是普通事件只支持單個事件,而事件綁定可以添加多個事件
6.IE和dom的事件流的區別
1.冒泡方式不同
IE采用事件冒泡的方式(具體到最大祖先元素)
netscape采用事件捕獲的方式(最大祖先元素到具體)
dom采用先捕獲后冒泡的方式
2.事件處理不同,參數不同,而且一個加on一個不加on
IE采用
attachEvent("onclick",function(){}) detachEvent("onclick",function(){})
dom采用
addEventListener("click",function,false)
removeEventListener("click",function,false)
3.阻止默認行為
IE:eve.returnValue=false
其他:eve.preventDefault();
4.停止事件冒泡
IE:eve.cancelBubble=true;
其他:eve.stopPropagation();
7.IE與其他瀏覽器的兼容性問題:
vareve=e||window.eventvarwidth=document.body.clientWidth||document.documentElment.clientWidthvartarget=eve.srcElement||eve.target
8.call與apply
網上看了那么多,講的有點拗口。說白了就是a.call(b,arg1,...)將a對象的方法加給b對象
例如:
functionanimal(){this.name="animal";this.showName=function(){? ? ? ? alert(this.name);? ? }}functioncat(){this.name="cat";}varanimal=newanimal();animal.showName();//輸出animalvat cat=newcat();anmial.showName.call(cat)//輸出是cat這就是將animal的showName方法加給cat對象來執行。
call與apply的區別就是參數寫法不同:
a.call(b,arg1,arg2,...)
a.apply(b,[arg1,arg2,...])
9.JS對象分類:
本地對象:array obj regExp等可以new實例化的
內置對象:Math等不可以實例化的
宿主對象:document window等瀏覽器自帶的
10.數組去重的方法:
function sort(arr){
var result={};
var newArr=[];
for(var i=0;i
if(!result[arr[i]]){
newArr.push(arr[i]);
result[arr[i]]=1;
}
}
return newArr;
}