Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
JS/Javascript使用.push或.unshift来跟踪变量的历史记录_Javascript_Arrays_Json - Fatal编程技术网

JS/Javascript使用.push或.unshift来跟踪变量的历史记录

JS/Javascript使用.push或.unshift来跟踪变量的历史记录,javascript,arrays,json,Javascript,Arrays,Json,我在做一个图书阅读器。我有一个变量CurrentPosition,顾名思义,它总是知道用户在书中的位置。我正在尝试创建用户位置的历史记录,以便添加一个类似web浏览器的后退按钮。因此,在设置中,我有: currentPostition; //this is a json object with book,chapter,page stored in it. history = []; //array of json objects 随后,当用户导航时(有几种不同类型的导航)

我在做一个图书阅读器。我有一个变量CurrentPosition,顾名思义,它总是知道用户在书中的位置。我正在尝试创建用户位置的历史记录,以便添加一个类似web浏览器的后退按钮。因此,在设置中,我有:

currentPostition;  //this is a json object with book,chapter,page stored in it.
history = [];          //array of json objects
随后,当用户导航时(有几种不同类型的导航):

到目前为止还好吧?问题就是这样。我的历史数组的长度如人们所期望的那样增长。但是,历史数组中的每个条目都将与放置在数组中的最后一个对象相同。即:

for (x=0;v<history.lenght;x++){
   document.write(history[x].book+","+history[x].chapter+","+history[x].page+"<br />");
}

for(x=0;v问题在于,在历史数组中推送currentPosition对象的相同实例。
这样做,您将得到指向同一currentPosition实例的多个指针

为了避免这个问题,您需要使用newcurrentPosition实例,如果您有构造函数,可以使用关键字new,或者简单地将对象复制到另一个实例中,如使用jQuery执行
$.extend({},currentPosition)

希望这有帮助

编辑: 您可以创建自己的扩展函数,如下所示:

function extends(destObject,srcObject){
  for(var i in srcObject){
    destObject[i] = srcObject[i];
  }
}
这是一个非常简单的版本,您可以找到稍微复杂一点的版本,它将递归地克隆您的对象,但我想我足以回答您的问题,因此它将是:

var oldPos = extends({},currentPosition);
history.push(oldPos);

JS中的大部分内容都是通过引用传递的。因此,您只将CurrentPosition的引用添加到数组中。在下次使用CurrentPosition之前,您需要分配新的空对象:

currentPostition = {};

我没有访问jquery的权限。如果没有jquery,我如何才能将对象复制到另一个对象中?您可以声明自己的扩展函数,请参阅我之前的响应编辑
currentPostition = {};