splice()方法經過刪除現有元素和/或添加新元素來更改一個數組的內容。數組
此方法會改變數組自身。優化
startthis
第一個參數start是修改的開始位置。若是超出若是超出了數組的長度,則從數組末尾開始添加內容;若是是負值,則表示從數組末位開始的第幾位(從-1計數);若只使用start參數而不使用deleteCount、item,表示刪除[start,end]的元素。spa
deleteCountprototype
整數,表示要移除的數組元素的個數。若是 deleteCount 是 0,則不移除元素。這種狀況下,至少應添加一個新元素。若是 deleteCount 大於start 以後的元素的總數,則從 start 後面的元素都將被刪除(含第 start 位)。code
item1,item2…blog
要添加進數組的元素,從start 位置開始。若是不指定,則 splice() 將只刪除數組元素。rem
var myFish = ["angel", "clown", "mandarin", "surgeon"]; //從第 2 位開始刪除 0 個元素,插入 "drum" var removed = myFish.splice(2, 0, "drum"); //運算後的 myFish:["angel", "clown", "drum", "mandarin", "surgeon"] //被刪除元素數組:[],沒有元素被刪除 var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon']; var removed = myFish.splice(3, 1); //運算後的myFish:["angel", "clown", "drum", "sturgeon"] //被刪除元素數組:["mandarin"] var myFish = ['angel', 'clown', 'drum', 'sturgeon']; var removed = myFish.splice(2, 1, "trumpet"); //運算後的myFish: ["angel", "clown", "trumpet", "surgeon"] //被刪除元素數組:["drum"] var myFish = ['angel', 'clown', 'trumpet', 'sturgeon']; var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue'); // 運算後的myFish: ["parrot", "anemone", "blue", "trumpet", "sturgeon"] // 被刪除元素數組:["angel", "clown"] var myFish = ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon']; var removed = myFish.splice(myFish.length - 3, 2); // 運算後的myFish: ["parrot", "anemone", "sturgeon"] // 被刪除元素數組:["blue", "trumpet"] var myFish = ['angel', 'clown', 'mandarin', 'sturgeon']; var removed = myFish.splice(2); // 運算後的myFish :["angel", "clown"] // 被刪除的元素數組: ["mandarin", "sturgeon"]
實現簡單的splice():string
Array.prototype.splice = function () { var del = []; if (arguments.length == 0) { return del; } else if (arguments.length == 1) { if (this.length == 0) { return del; } else { var start; if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !isNaN(arguments[0])) { start = parseInt(arguments[0]); if (start < 0 && Math.abs(start) > this.length) { del = JSON.parse(JSON.stringify(this)); this.length = 0; return del; } else if (start < 0 && Math.abs(start) < this.length) { start = this.length - 1 - Math.abs(start); for (var i = start; i < this.length; i++) { del.push(JSON.parse(JSON.stringify(this[i]))); } this.length = start; return del; } else if (start > 0 && start > this.length) { return del; } else if (start == 0) { del = JSON.parse(JSON.stringify(this)); this.length = 0; return del; } else if (start > 0 && start < this.length) { for (var i = start; i < this.length; i++) { del.push(JSON.parse(JSON.stringify(this[i]))); } this.length = start; return del; } } else { del = JSON.parse(JSON.stringify(this)); this.length = 0; return del; } } } else if (arguments.length >= 2) { var start, deleteCount; var items = Array.prototype.slice.call(arguments,2); if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !isNaN(arguments[0])) { start = parseInt(arguments[0]); if (start < 0 && Math.abs(start) > this.length) { start = 0; } if (start < 0 && Math.abs(start) < this.length) { start = this.length - 1 - Math.abs(start); } } else { start = 0; } if (Object.prototype.toString.call(arguments[1]) === '[object Number]' && !Number.isNaN(arguments[1])) { if (arguments[1] < 0) { deleteCount = 0; } else { deleteCount = parseInt(arguments[1]) } } else { deleteCount = 0; } if (deleteCount > 0 && start < this.length) { for (var i = start; i < start + deleteCount; i++) { del.push(JSON.parse(JSON.stringify(this[i]))) } var temp = start; for (var i = temp + deleteCount; i < this.length; i++ ) { this[temp++] = this[i]; } this.length = this.length - deleteCount; } if (arguments.length == 2) { return del; } if (arguments.length > 2) { var itemLength = items.length; if (start >= this.length) { for (var i = 0; i < items.length; i++) { this[this.length] = items[i]; } } else if (start < 1) { for (var i = items.length - 1; i >= 0; i--) { this.unshift(items[i]); } } else { var arrLength = this.length; var temp = start; this.length = this.length + itemLength; for (var i = arrLength - 1, j = 1; i >= start; i--, j++) { this[this.length - j] = this[i]; } for (var i = 0; i < itemLength; i++) { this[temp++] = items[i]; } } } return del; } }
上面實現的splice優化:it
Array.prototype.splice = function () { var del = []; if (arguments.length == 0) { return del; } else if (arguments.length == 1) { if (this.length == 0) { return del; } else { var start; if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !(arguments[0] != arguments[0])) { start = arguments[0] >> 0;//右移0位取整 var realStart = start < 0 ? Math.max(this.length + start, 0) : Math.min(start, this.length); for (var i = realStart; i < this.length; i++) { del.push(JSON.parse(JSON.stringify(this[i]))); } this.length = realStart; return del; } else { del = JSON.parse(JSON.stringify(this)); this.length = 0; return del; } } } else if (arguments.length >= 2) { var start, deleteCount, realStart; var items = Array.prototype.slice.call(arguments,2); if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !(arguments[0] != arguments[0])) { start = arguments[0] >> 0;//右移0位取整 realStart = start < 0 ? Math.max(this.length + start, 0) : Math.min(start, this.length); } else { realStart = 0; } if (Object.prototype.toString.call(arguments[1]) === '[object Number]' && !(arguments[0] != arguments[0])) { if (arguments[1] < 0) { deleteCount = 0; } else { deleteCount = arguments[1] >> 0; } } else { deleteCount = 0; } if (deleteCount > 0 && realStart < this.length) { for (var i = realStart; i < realStart + deleteCount; i++) { del.push(JSON.parse(JSON.stringify(this[i]))) } var temp = realStart; for (var i = temp + deleteCount; i < this.length; i++ ) { this[temp++] = this[i]; } this.length = this.length - deleteCount; } if (arguments.length == 2) { return del; } if (arguments.length > 2) { var itemLength = items.length; if (realStart >= this.length) { for (var i = 0; i < items.length; i++) { this[this.length] = items[i]; } } else if (realStart < 1) { for (var i = items.length - 1; i >= 0; i--) { this.unshift(items[i]); } } else { var arrLength = this.length; var temp = realStart; this.length = this.length + itemLength; for (var i = arrLength - 1, j = 1; i >= realStart; i--, j++) { this[this.length - j] = this[i]; } for (var i = 0; i < itemLength; i++) { this[temp++] = items[i]; } } } return del; } }