利用了兩天的時間,使用typescript和原生js重構了一下JavaScript中數組對象的主要方法,可以移步github查看。
這里,按照MDN上的文檔順序,再重新學習一下數組方法吧。
- concat:
concat()
方法用於合並兩個或多個數組。此方法不會更改現有數組,而是返回一個新數組。
給出的示例是:
var array1 = ['a', 'b', 'c']; var array2 = ['d', 'e', 'f']; console.log(array1.concat(array2));
期望輸出:["a", "b", "c", "d", "e", "f"]。這也符合我們正常的使用方式。那么還有沒有特殊的地方呢?
1、由於concat()方法返回一個新數組,那么如果不傳參數,會怎樣呢?var array1 = ['a', 'b', 'c']; var arr3 = array1.concat() console.log(array1==arr3); // false
很明顯,可以實現數組的淺拷貝。
2、如果參數不是數組呢?var array1 = ['a', 'b', 'c']; var arr3 = array1.concat("3", true, null, undefined, {key: "value"}) console.log(arr3);
輸出結果:
把所有參數都當做數組元素拼接到array1后面,並返回一個新的數組實例。
想到了什么?這種情況是不是與push方法很像。區別在於push是修改原數組,concat是返回新數組。
到這里,我們是不是可以嘗試重構一下concat的方法呢?function concat() { if (!(arguments[0] instanceof Array)) throw new Error("請確保第一個參數類型為數組") var results = [] for (var i = 0; i < arguments.length; i++) { if (!(arguments[i] instanceof Array)) { results[results.length] = arguments[i] break; } for (var j = 0; j < arguments[i].length; j++) { results[results.length] = arguments[i][j] } } return results }
稍作解釋的是,沒有在數組原型上重構各種方法,僅僅是封裝為一個個的函數,所以函數的第一個參數,都要求是需要操作的數組。
-
push:
push()
方法將一個或多個元素添加到數組的末尾,並返回該數組的新長度。
按照順序而言,這里不應該是push的,但是既然在談concat的時候,提到push了,那么就先來push吧!
慣例,先看MDN給出的示例:var animals = ['pigs', 'goats', 'sheep']; console.log(animals.push('cows')); // expected output: 4 console.log(animals); // expected output: Array ["pigs", "goats", "sheep", "cows"] animals.push('chickens'); console.log(animals); // expected output: Array ["pigs", "goats", "sheep", "cows", "chickens"]
看結果:
很容易理解,push修改的是原數組,並返回修改后的數組長度。
同理,我們分別測試:
1、不傳參數var animals = ['pigs', 'goats', 'sheep']; var b = animals.push() console.log(b );
輸出值為3,那么3是哪里來的呢?很明顯就是animals.length,突然美滋滋的,下次再獲取數組長度,是不是可以裝X一下!!!
2、傳遞多個不同類型的參數var animals = []; animals.push(['dogs', []],"3", true, null, undefined, {key: "value"}) console.log(animals);
查看結果:
就是說不管什么類型的參數,一個參數都將作為一個元素,插入到原數組當中。
那就重構一下push吧!第一個參數也是需要操作的數組!function push(arr) { if (!(arr instanceof Array)) throw new Error("請確保參數類型為數組") for (var i = 1; i < arguments.length; i++) { arr[arr.length] = arguments[i] } return arr.length }
剩余的方法,期待后續了!