Javascript數組方法探究一二
1. Array.prototype.slice方法數組的 slice 方法通常用來從一個數組中抽取片斷。不過,它還有將“類數組”(比如arguments和HTMLCollection)轉換為真正數組的本領。1 var nodesArr = Array.prototype.slice.call(document.forms);2 3 var argsArr = Array.prototype.slice.call(arguments);我就好奇了為什麼數組的slice方法有這樣的本領,它在javascript引擎中是如何?的?slice的兄弟方法有沒有這樣的本領? 帶著好奇心,下載Google的V8 javascript引擎源碼到本地,V8源碼的:https://github.com/v8/v8。 在v8-master/src/array.js中尋找“Array.prototype.slice”: 1 function ArraySlice(start, end) { 2 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice"); 3 ... 4 var result = []; // 這句是關鍵 5 6 if (end_i < start_i) return result; 7 8 if (UseSparseVariant(array, len, IS_ARRAY(array), end_i - start_i)) { 9 ...10 SparseSlice(array, start_i, end_i - start_i, len, result);11 } else {12 SimpleSlice(array, start_i, end_i - start_i, len, result);13 }14 ...15 return result; 接著猜想調用“類數組”走的應該是SimpleSlice方法,然後在源碼尋找“SimpleSlice“,發現Array.prototype.splice源碼中也調用了SimpleSlice方法,且結果變數也初始化為空白數組。不過,想用splice方法把“類數組”轉化為真正數組,必須要傳入起始位置參數為0,即: var nodesArr = Array.prototype.splice.call(document.forms, 0);因為它的實現原理就是將被刪除的數組項組成新數組。感興趣的童鞋可以看下Array.prototype.splice的源碼實現。此外,slice還可以複製一個數組: 1 var arr = [1, 2, 3];2 var cloneArr = arr.slice(); // cloneArr: [1, 2, 3] 2. Array.prototype.push 方法使用 push方法可以合并數組: 1 var arr1 = [1, 'str', {name: 'lang'}];2 var arr2 = [2, 'ing'];3 Array.prototype.push.apply(arr1, arr2);4 // 返回結果:[1, "str", {name: 'lang'}, 2, "ing"] 3. Array.prototype.sort 方法先上代碼: var arr = ['1', '2', '10', '12'];arr.sort();// 返回結果:["1", "10", "12", "2"]上面的結果通常不是我們想要的,那麼如何按數值大小排序: arr.sort(function(a, b) { return a - b;})// 返回結果:["1", "2", "10", "12"]有了排序比較子函數之後,就可以自訂很多比較子,從而實現個人化的排序。 4. length 屬性數組的length屬性,不是唯讀,也就說還可寫哦,比如使用length屬性去截斷數組: 1 var arr = [1, 2, 3, 4];2 arr.length = 2;3 // arr: [1, 2]4 arr.length = 0;5 // arr: []與此同時,如果把length屬性變大,數組的長度值變會增加,且使用undefined來作為新的元素填充。 1 var arr = [];2 arr.length = 3;3 // arr: [undefined, undefined, undefined]