Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中为数组创建重复的原型方法_Javascript_Prototypal Inheritance - Fatal编程技术网

如何在javascript中为数组创建重复的原型方法

如何在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

我正在尝试对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.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]
};