如何在javascript中为数组创建重复的原型方法
我正在尝试对js阵列原型实现一个复制方法,该方法将阵列的副本复制到自身,如下所示:如何在javascript中为数组创建重复的原型方法,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我正在尝试对js阵列原型实现一个复制方法,该方法将阵列的副本复制到自身,如下所示: [11,22,3,34,5,26,7,8,9].duplicate(); // [11,22,3,34,5,26,7,8,9,11,22,3,34,5,26,7,8,9] 以下是我所拥有的,但它会导致浏览器崩溃: var array = [11,22,3,34,5,26,7,8,9]; Array.prototype.duplicate = function() { var j = this.lengt
[11,22,3,34,5,26,7,8,9].duplicate(); // [11,22,3,34,5,26,7,8,9,11,22,3,34,5,26,7,8,9]
以下是我所拥有的,但它会导致浏览器崩溃:
var array = [11,22,3,34,5,26,7,8,9];
Array.prototype.duplicate = function() {
var j = this.length;
for(var i = 0; i < this.length; i++) {
this[j] = this[i];
j++;
}
return this;
}
var数组=[11,22,3,34,5,26,7,8,9];
Array.prototype.duplicate=函数(){
var j=该长度;
for(var i=0;i
我尝试使用原生JS作为迭代和算法的实践,因此如果可能的话,我尝试避免使用内置方法,这样我就可以更清楚地了解事物是如何移动的
关于它崩溃的原因以及我如何优化它,你有什么想法吗?循环中的代码会改变数组的长度,因此它会不断增长,你永远不会到达它的尽头。获取变量中数组的初始长度,并在循环条件中使用。您也可以将其用作目标索引的偏移量,而不是另一个计数器:
var array = [11,22,3,34,5,26,7,8,9];
Array.prototype.duplicate = function() {
var len = this.length;
for (var i = 0; i < len; i++) {
this[len + i] = this[i];
}
return this;
}
var数组=[11,22,3,34,5,26,7,8,9];
Array.prototype.duplicate=函数(){
var len=此长度;
对于(变量i=0;i
数组的长度随着每个元素的添加而增加,因此不能将其用作终止符。试试这个
var j = this.length;
for(var i = 0; i < j; i++) {
this[i+j] = this[i];
}
var j=this.length;
对于(变量i=0;i
以下是最简单的代码
Array.prototype.duplicate = function () {
var array = this;
return array.concat(array);
};
使用扩展语法;
在方法中,此引用所有者对象
let数组=[1,2,3,4,5];
Array.prototype.duplicate=函数(){
返回[…这个,…这个]
};
console.log(array.duplicate())
一旦你理解了你想知道的,我就返回这个.concat(这个)
@elclars:这很优雅,但一个小但可能重要的区别是它创建了一个新数组,而不是更改当前数组。@Guffa,这太难了:this.splice.apply(this[this.length,0].concat(this))
:p这很有意义,但为什么len每次迭代都会增加哪个?它不是迭代的一部分,所以我不知道如何或何时重新计算var len=this.length。@doremi:向数组中添加项时,数组的length
属性会增加。在原始代码中,循环条件中有this.length
。var len=this.length;这不就是静态设置len一次吗?如何/在何处使用新长度更新len?我能理解len=this.length是否在循环中,但它不是。这是我不明白的部分。@doremi:没有更新。len
变量的要点是它包含数组的初始长度,当数组的长度改变时,它不会改变。这是错误的,并且会导致无限循环。请参见下面@Guffa关于j不断增加的回应。@doremi:注意j++代码>未包含在此代码中,因此它不会增加,因此工作正常。(我在代码中使用了不同的变量名,表明它的使用方式与原始代码中的j
变量不同。)为什么不返回this.concat(this)代码>?当然,我们可以做到!谢谢@GabrielTomitsuka
Array.prototype.duplicate = function () {
return [...this, ...this]
};