JS/Javascript使用.push或.unshift来跟踪变量的历史记录
我在做一个图书阅读器。我有一个变量CurrentPosition,顾名思义,它总是知道用户在书中的位置。我正在尝试创建用户位置的历史记录,以便添加一个类似web浏览器的后退按钮。因此,在设置中,我有: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 随后,当用户导航时(有几种不同类型的导航)
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 = {};