push() 方法將一個或多個元素添加到數組的末尾,並返回該數組的新長度。
javascript
從解釋中能夠看出,push方法只要將要添加的元素依次放到數組的最後便可,不會改變原有數組元素的索引。因此循環參數列表,將新元素依次放到數組的最後便可。java
Array.prototype._push = function(...value) { for (var i = 0; i < arguments.length; i++) { this[this.length] = arguments[i] } return this.length } var arr = [1, 2, 3, 4]arr._push(9, 8) console.log(arr) // [ 1, 2, 3, 4, 9, 8 ]
unshift() 方法將一個或多個元素添加到數組的開頭,並返回該數組的新長度(該方法修改原有數組)。
數組
向數組的頭部添加元素,數組的長度也會發生變化,但不像尾部添加的操做,數組原有元素索引不改變。作頭部添加的操做,須要將原有元素的索引向右移動。
例如只添加一位,則須要將數組的每一個元素的索引依次向右移一位,假設原來數組長度是4,頭部添加一個元素,長度變爲5. this
因此如今就變成:array.length = 5,而目前array[5 - 1]是最後一個元素,如今因爲依次日後移動,因此,array[5]必須是最後一個元素
因此咱們能夠從數組的最後一位的下一位往前循環,將array[i]賦值爲array[i - 1],循環到1中止,將array的第0項賦值爲須要添加的值。 spa
過程以下 prototype
具體代碼實現:code
Array.prototype._unshift = function(value) { for (let i = this.length; i > 0; i--) { this[i] = this[i - 1] } this[0] = value return this.length } var arr = [1, 2, 3, 4]arr._unshift(8) console.log(arr); // [ 8, 1, 2, 3, 4 ]
但上面的代碼只實現了一個元素的頭部添加,unshift方法支持添加多個元素。例如:對象
var arr = [1, 2, 3, 4]arr.unshift(8, 7) console.log(arr); // [ 8, 7, 1, 2, 3, 4 ]
針對這樣的狀況,須要知道傳入了幾個參數,能夠從arguments對象入手,思路仍是上面的思路: 先以最後生成的數組長度爲基準從後往前循環,依次移動元素,而後將新元素依次放到數組的頭部
blog
新數組的長度等於原數組的長度 + 參數的個數,從後往前循環,將原數組的最後一位,移動到新數組的最後一位,
由於須要在頭部插入數量爲入參個數的元素,因此循環的起點爲原數組的長度 + 參數的個數,循環的終點爲入參的個數。
但因爲索引老是比長度少一位,因此起點和終點都須要減1。 索引
如今能夠先把循環移動的邏輯寫出來
Array.prototype._unshift = function(...value) { for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) { this[i] = this[i - arguments.length] }}
再思考一下,因爲上一步已經移動完了,數組頭部的位置已經空出來了,第二步是有幾個參數就要插入幾個元素。因此如今只須要循環插入就好:
for(var k = 0; k < arguments.length; k++) { this[k] = arguments[k] }
完整的代碼以下:
Array.prototype._unshift = function(...value) { for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) { this[i] = this\[i - arguments.length] } for(var k = 0; k < arguments.length; k++) { this[k] = arguments[k] } return this.length } var arr = [1, 2, 3, 4\]arr._unshift(9, 8) console.log(arr); // [ 9, 8, 1, 2, 3, 4 ]
`pop() 方法將刪除 arrayObject 的最後一個元素,把數組長度減 1,而且返回它刪除的元素的值。若是數組已經爲空,則 pop() 不改變數組,
並返回 undefined 值。`
這個很好實現,按照定義一步一步作就能夠。首先,記錄下最後一個元素,便於返回,以後從數組中刪除最後一個元素,
將其指向null釋放掉,而後將數組的長度減1,最後判斷一下是否爲空數組。
Array.prototype._pop = function () { if (!this.length) { return undefined } var end = this[this.length - 1] this[this.length - 1] = null this.length = this.length - 1 return end} var arr = [1, 2, 3, 4]arr._pop() console.log(arr); // [ 1, 2, 3 ]
shift() 方法用於把數組的第一個元素從其中刪除,並返回第一個元素的值。
頭部刪除,會改變原有數組元素的索引,也就是將未被刪除的元素索引都往左移一位,首先要將被刪除的元素記錄下來便於返回,以後將數組第一個元素指向null,
最後循環數組,移動索引。
Array.prototype._shift = function () { if (!this.length) { return undefined } var start = this[0] this[0] = null for(var i = 0; i < this.length - 1; i++) { this[i] = this[i + 1] } this.length = this.length - 1 return start} var arr = [1, 2, 3, 4]arr._shift() console.log(arr); // [ 2, 3, 4 ]