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]
補充:
使用以下方法也可將類數組轉換為真實數組:
(1). [].concat.apply([], 類數組); 
(2). var arr = [];   [].push.apply(arr, 類數組);

 

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]

 

 

好了,今天就總結到這里了,已經凌晨了,以后有什么新發現再append到這里。
之前,沒有寫博客的習慣,只習慣把平時的總結放到有道雲筆記中,沒想到把觀點寫出來着實要花點心思的,因為要考慮如何表達,才能讓別人更好地理解。

有什么表達不對或理解錯誤的地方,還望大家幫忙指正出來。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM