var obj = {
'1':'a',
'2':'b',
'length':'2',
push:Array.prototype.push
};
obj.push('c');
瀏覽器執(zhí)行以上腳本后,obj 的 length 屬性會變?yōu)?3;obj[2] 的值是 c;obj[3] 的值是 undefined;
push 方法把值添加到數(shù)組中。
push 方法有意具有通用性。該方法和 call() 或 apply() 一起使用時,可應(yīng)用在類似數(shù)組的對象上。push 方法根據(jù) length 屬性來決定從哪里開始插入給定的值。如果 length 不能被轉(zhuǎn)成一個數(shù)值,則插入的元素索引為 0,包括 length 不存在時(上面代碼去掉“'length':'2',”時,obj的length屬性會被創(chuàng)建并被賦值為1,obj[0]為push進(jìn)去的c,r若再obj.push('g');則length為2,obj[0]=‘c’,obj[1]='g',obj[2]='b',obj[3]='undefined',再push一個,則obj[2]的值會被覆蓋,obj[3]='undefined',)。當(dāng) length 不存在時,將會創(chuàng)建它。
唯一的原生類數(shù)組(array-like)對象是 Strings,盡管如此,它們并不適用該方法,因?yàn)樽址遣豢筛淖兊摹?br> 當(dāng)調(diào)用該方法時,新的 length 屬性值將被返回。
所以說,push會根據(jù)對象length屬性的值去確定插入的位置,即this[i+n] = %_Arguments(i)。
所以在原題中obj.length值為2,調(diào)用obj.push("c")時,會發(fā)生obj[2]="c"的情況,所以最后 obj[2]就變成了'c',而不是原來的'b'。
當(dāng)然了,push方法最后會根據(jù)傳入的參數(shù)個數(shù)多少,即arguments.length來返回new_length,并賦值給obj.length。