Javascript JS-覆盖';这';在功能上

Javascript JS-覆盖';这';在功能上,javascript,object,Javascript,Object,我正在尝试扩展阵列原型: Array.prototype.rotate = function() { var arr = []; for (var i = 0; i < this[0].length; ++i) { arr[i] = []; for (var j = 0; j < this.length; ++j) { arr[i].push(this[j][i]) } } this = arr; return arr; }

我正在尝试扩展阵列原型:

Array.prototype.rotate = function() {
  var arr = [];
  for (var i = 0; i < this[0].length; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  this = arr;
  return arr;
}
我不需要这样做:

myArray = myArray.pop();
另一次编辑 我这样做是为了解决问题,但这似乎很愚蠢:

Array.prototype.rotate = function() 
{
  var arr = [];
  var len = this[0].length;
  for (var i = 0; i < len; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  for (var i = 0; i < this.length; ++i) {
    delete this[i];
  }
  for (var i = 0; i < arr.length; ++i) {
    this[i] = arr[i];
  }
  return arr;
}
我会得到:

[[1, 2, 3], [1, 2, 3], ]

看到那个空白的第三项了吗?是的-这引起了我的问题。

你不能编辑
这个
,但是你可以编辑
这个[i][j]
,所以用循环将你的临时数组复制到
这个

虽然你不能覆盖
这个
,但是你可以肯定地将工作数组的值设置为你在函数中构建的数组。大概是这样的:

Array.prototype.rotate = function() {
  var arr = [];
  for (var i = 0; i < this[0].length; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  this.length = 0; //empty the array
  this.push.apply(this, arr); //push all of the elements from arr onto this
  return arr;
}
Array.prototype.rotate=function(){
var-arr=[];
对于(var i=0;i
正如@Meredith所说,如果您修改此数组而不是新数组,您将得到预期的结果。以下测试对我有效:

Array.prototype.rotate = function(){
    var a = this[0];
    this[0] = this[1];
    this[1] = a;
};

var test = [1,2];
test.rotate();
console.log(test); // [2,1]

您不能将值显式分配给此。在这种情况下,它应该完成什么?避免变异,只需将返回的数组分配给一个新变量。
.pop
是如何完成的<代码>变量值=此[this.length-1];这个长度-=1;返回值,或者类似的东西。除了删除最后一个值之外,它不会更改“this”数组。我认为您要查找的是一个
zip
,请检查我是否这样做了,但是它留下了前一个数组的残余,诸如此类。请先用
this.length=0清除它那部分是我缺少的。谢谢你的帮助!这似乎可以解决这个问题。
This.length=0
不过我认为它是空的。如果原始数组中的元素多于
arr
,则可能会有剩余元素。@TravisJ:规范规定,索引>长度处的每个元素都应该删除。在这里的某个地方:(然而,我认为有些浏览器的情况下,这不能正常工作……但我记不清了)。@FelixKling-谢谢你的澄清
Array.prototype.rotate = function() {
  var arr = [];
  for (var i = 0; i < this[0].length; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  this.length = 0; //empty the array
  this.push.apply(this, arr); //push all of the elements from arr onto this
  return arr;
}
Array.prototype.rotate = function(){
    var a = this[0];
    this[0] = this[1];
    this[1] = a;
};

var test = [1,2];
test.rotate();
console.log(test); // [2,1]