JavaScript奇技淫巧之遍歷數組
正常的for循環就不提了,直接進入正題。如下:
//示例1 for(var i=0,a;a=["jack","tom","lily","andy"][i++];){ console.log(a); } //示例2 var ary = ["jack","tom","lily","andy"]; for(var i=0,a;a=ary[i++];){ console.log(a); }
從Firebug控制臺能看到依次輸出jack ,tom ,lily ,andy。這里有個問題,示例1不知是否會每次都產生一個數組對象實例,如果是,數組很大時可能會有性能問題。這個技巧關鍵是這句
a = ary[i++];
JS中數組實際上也是一個普通的Object。屬于索引數組且并非“連續分配”內存的,因此索引方法并不會帶來很高的效率。見 索引數組、關聯數組和靜態數組、動態數組中括號[i++]依然是一個普通對象取屬性操作而已,試試看
var ary = ["jack","tom","lily","andy"]; for(var a in ary) { console.log(a); }
Firebug控制臺輸出0,1,2,3。證明了0,1,2,3的確是數組ary的屬性。既然是ary的屬性,那么是否可以通過點運算符(.)來存取呢?試試看
for(var j=0;j<ary.length;j++) { console.log(ary.j);//undefined }
為什么示例1,2中用中括號[]存取就可以了呢?因為中括號ary[0],ary[1],ary[2],ary[3]里的0,1,2,3是字符串類型的。如下:
for(var atr in ary) { console.log(atr + ":" + typeof atr); }
輸出如下:
0:string
1:string
2:string
3:string
鮮為人知的是用中括號[]存取時,JS引擎內部隱式的將數字轉成了字符串。 而作為[]存取時屬性可以不遵循JS標識符規則(純數字不能作為變量命名)。如
var obj = {}; obj.11 = 11; // 非法 obj['11'] = 11; // 合法
全站熱搜