讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議10:謹記對像非空特性 >

建議10:謹記對像非空特性

JavaScript從來沒有真正的空對象,因為每個對象都可以從原型鏈中取得成員,這種機制會帶來很多麻煩。例如,在編寫統計一段文本中每個單詞的出現次數的代碼時可以這樣設計:先使用toLowerCase方法統一轉換文本為小寫格式,接著使用split方法以一個正則表達式為參數生成一個單詞數組,然後可以遍歷該數組中每個單詞,並統計每個單詞出現的次數。


var i,word;

var text="A number of W3C staff will be on hand to discuss HTML5,CSS,and other technologies of the Open Web Platform.";

var words=text.toLowerCase.split(/[\s,.]+/);

var count={};

for(i=0;i<words.length;i+=1){

word=words[i];

if(count[word]){

count[word]+=1;

}else{

count[word]=1;

}

}


在執行結果中,count["on"]的值為1,count["of"]的值是3,而count.constructor卻包含著一個看上去令人不可思議的字符串。在主流瀏覽器上,count.constructor將會返回字符串:function Object{[native code]}。其原因是count對像繼承自Object.prototype,而Object.prototype包含一個名為constructor的成員對象。count.constructor的值是一個Object。+=運算符,就像+運算符一樣,如果它的運算數不是數字時會執行字符串連接的操作而不是加法運算。因為count對象是一個函數,所以+=運算符將其轉換成一個莫名其妙的字符串,然後再把一個數字1加在它的後面。

採用與處理for in中問題相同的方法來避免類似的問題:用hasOwnProperty方法檢測成員關係,或者查找特定的類型。在當前情形下,可以編寫如下過濾條件:


if(typeof count[word]==='number'){

}