首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Temp Javascript对象

Temp Javascript对象
EN

Stack Overflow用户
提问于 2015-04-07 06:22:29
回答 2查看 3.3K关注 0票数 0

我以前也遇到过这个问题,为了得到我想要的结果,我对它进行了黑客攻击,但最终还是碰壁了,我不明白为什么会这样。

在JavaScript中,如何只捕获不指向原始对象的浅拷贝?快把我逼疯了。我知道JS中的所有东西都是一个指针,但是必须有一种方法来获得一个深度副本,当修改它时,不会改变原始对象。下面是我正在使用的代码:

代码语言:javascript
复制
MyGame.runAllPossibleMoves = function() {
MyGame.ai_object.board = MyGame.tetrominos;
MyGame.ai_object.piece = MyGame.tetromino;

  for(var i = 0; i < 10; i++){
    if(i < MyGame.ai_object.piece.pivot.x){
      while(moveLeft() && i < MyGame.ai_object.piece.pivot.x){
       //do piece movement
      }

      hardDrop();
    }
    console.log(MyGame.ai_object.piece.pivot.x + ',' + MyGame.ai_object.piece.pivot.y);
    console.log(MyGame.tetromino.pivot.x + ',' + MyGame.tetromino.pivot.y);
    MyGame.ai_object.board = MyGame.tetrominos;
    MyGame.ai_object.piece = MyGame.tetromino;
    //console.log(MyGame.ai_object.piece);
  }
}

当我真正想要做的是修改我创建的临时变量并使用MyGame.tetromino重置我的临时对象时,这个对象MyGame.tetromino正在被更新为任何MyGame.ai_object.piece。我哪里出错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-07 06:30:08

这是最简单的,并且假设没有什么不安全地扩展了Object.prototype

代码语言:javascript
复制
Object.shallowCopy = function(obj) {
    var r = Array.isArray(obj) ? new Array(obj.length) : {};
    for (var k in obj) {
        r[k] = obj[k];
    }
    return r;
}

由于这是一个浅拷贝,任何“复制”的值--即对象本身--都将保持对原始值的引用。

在各种图书馆中都存在着等价的函数。特别是(没有与jQuery相关的DOM行李),underscore.js中有_.clone

编辑-对于深拷贝来说,简单的递归应该足够了,再次假设Object.prototypeArray.prototype都没有被不安全地修改:

代码语言:javascript
复制
Object.deepCopy = function(obj) {
    var r = obj;
    if (typeof obj === 'object') {
        r = Array.isArray(obj) ? new Array(obj.length) : {};
        for (var k in obj) {
            r[k] = Object.deepCopy(obj[k]);
        }
    }
    return r;
}

注意:如果传递了一个包含对自身的循环引用的结构,此函数将无法完成。

票数 2
EN

Stack Overflow用户

发布于 2015-04-07 07:20:37

当我意识到我要的是一份浅薄的副本,但确实需要一份深拷贝(由于某种原因,我想是咖啡因不够),我在网上和其他几个答案中发现了这一点:

代码语言:javascript
复制
MyGame.ai_object.board = (JSON.parse(JSON.stringify(MyGame.tetrominos)));
MyGame.ai_object.piece = (JSON.parse(JSON.stringify(MyGame.tetromino)));

这就创造了我一直在寻找的深刻的复制品。还有几个其他的答案,所以我发现了我的错误。

编辑:

使用JSON.parse(JSON.stringify(obj))会消耗大量的资源。以下是获取深度副本的另一种方法:

代码语言:javascript
复制
deepCopy = function(obj){
  var temp;
  for(var n in obj){
    temp[n] = obj[n];
  }
  return temp;
}

这将复制obj中的每个项,并将其分配给新对象temp。这将不会创建obj中任何对象的深度副本(您必须再次调用deepCopy )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29485073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档