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; } }