正常的for迴圈就不提了,直接進入正題。如下:
1
2
3
4
5
6
7
8
9
//示例1
for
(
var
i=0,a;a=[
"jack"
,
"tom"
,
"lily"
,
"andy"
][i++];)
//示例2
var
ary = [
"jack"
,
"tom"
,
"lily"
,
"andy"
];
for
(
var
i=0,a;a=ary[i++];)
從firebug控制台能看到依次輸出jack ,tom ,lily ,andy。這裡有個問題,示例1不知是否會每次都產生乙個陣列物件例項,如果是,陣列很大時可能會有效能問題。
這個技巧關鍵是這句
a = ary[i++];
js中陣列實際上也是乙個普通的object。屬於索引陣列且並非「連續分配」記憶體的,因此索引方法並不會帶來很高的效率。
見 索引陣列、關聯陣列和靜態陣列、動態陣列
中括號[i++]依然是乙個普通物件取屬性操作而已,試試看
1
2
3
4
var
ary = [
"jack"
,
"tom"
,
"lily"
,
"andy"
];
for
(
var
a
in
ary)
firebug控制台輸出0,1,2,3。證明了0,1,2,3的確是陣列ary的屬性。
既然是ary的屬性,那麼是否可以通過點運算子(.)來訪問呢?試試看
1
2
3
for
(
var
j=0;j
console.log(ary.j);
//undefined
}
為什麼示例1,2中用中括號訪問就可以了呢?因為中括號ary[0],ary[1],ary[2],ary[3]裡的0,1,2,3是字串型別的。如下:
1
2
3
for
(
var
atr
in
ary)
輸出如下:
0:string
1:string
2:string
3:string
鮮為人知的是用中括號訪問時,js引擎內部隱式的將數字轉成了字串。 而作為訪問時屬性可以不遵循js識別符號規則(純數字不能作為變數命名)。如
1
2
3
var
obj = {};
obj.11 = 11;
// 非法
obj[
'11'
] = 11;
// 合法
警示:這個for迴圈的缺陷是當陣列元素是null,undefined,0,false等時會造成迴圈終止。要很清楚了解陣列內存放的元素,否則會埋下bug的伏筆
C 之奇技淫巧
typedef struct data 0 pdata 0 typedef struct data 1 pdata 1 結構體data 0與data 1在性質上沒有什麼不同,它們的size是相等的,都是8.但在用法上有很大區別。例 pdata 0 stack0 pdata 0 malloc max ...
git 奇技淫巧
例如 1.0.0 git tag a 1.0.0 m 1.0.0 版本的備註資訊.複製 git push origin tags 複製 例如 1.0.0 git tag d 1.0.0 複製 刪除遠端標籤需要先刪除本地標籤,再執行下面的命令 git push origin refs tags 1.0...
奇技淫巧訓練之五
這道題真的很好,寫題解的人寫的也真好 如果要保留 a i a i 和 a j a j 前提是 他們中間的數本身就合法,或者他們中間的數可以被改成合法。比如,17,50,50,50,19這個序列,看上去17和19能保留,但如果保留,中間三個50怎麼改都不會單調上公升。可見只有 a j a j 和 a ...