Array.prototype.push push向數組尾部添加一項並更新length ,返回數組長度。
如果Object使用push會怎麼樣?
看下面程式碼, obj好像陣列一樣運作了。 length會自動更新。
var push = Array.prototype.push; var obj = {};
push.call(obj, "hello"); // 傳回值1
// obj {"0":"hello", length:0}
push.call (obj, "world"); // 傳回值2
// obj {"0":"hello", "1":"world",length:2}
Array .prototype.length Array.prototype.splice
把length和splice 給Object
看下面程式碼:obj這貨居然變成陣列了?其實不然這可能是調試工具的一些輸出檢查問題。
我們用instanceof 測試obj instanceof Array //false
var obj = { length:0, splice:Array.prototype.splice};console.log( obj ); // 印出:[]
繼續看下面的程式碼
: obj.push(0)//回傳obj.length
1obj.push(1)//回傳obj.length
2obj.splice (0, 1);//刪除第一項返回刪除項目
[0]obj.length // 1 splice刪除一項的時候同樣更新length屬性
這樣obj的表現幾乎和array一樣了。不出意外slice,pop,shift,unshift什麼的都可以正常運作在object中。
不過如果直接設定length,在陣列中會刪除大於length的下表的項, 但裡的obj並不不會更新。
應用在哪裡?
jQuery物件表現像一個array,其實他是個物件。這種物件如何new出來呢?
實際jQuery把Array的方法借給Object,從而達到這個jQuery物件的效果,jQuery物件內部也直接使用push等Array的方法。
看看jQuery的部分源碼(注意加粗)
// Start with an empty selector
selector: "",
// The current version of jQuery being used
jquery: "1.7.1",
// The default length of a a a default length of a/ The default length of a jQuery object is 0
length: 0,
......
// For internal use only.
// Behaves like an Array's method, not like a jQuery method. push: push,
sort: [].sort,
splice: [].splice
如果你要把Object玩成Array,那麼可能潛在的問題length屬性不會和「數組」項總和對應起來。
所以直接使用length設定長度不會得到支援。
看下面jquery程式碼,雖然length更新了,jquery的物件並沒更新。 (當然這不是jquery的問題)
var jq = $('div') //假設我們在頁面取得了40個
divjq.length // 40
jq.length = 0;jq // ? jq中仍然存放了40個dom物件length屬性不會和「陣列」項總和對應。
Object使用array的方法還能正常運作,實在有些意想不到,可能實際應用遠不止這些。