我试图将变量复制到新变量,不是通过引用,而是通过硬拷贝。根据我的理解,JavaScript默认情况下会对原始类型进行硬拷贝。但是,如果我这样做,我会得到一份参考副本:
var u = [0, 12, 34, 56];
var v = u[1];
u[1] = 85;
console.log(v); // returns 85, I want it to return 12
所以我猜你[1]毕竟不是原始类型(即使它只是一个12,这是一个数字,在我的理解中应该是原始的)。有没有办法可以制作硬拷贝?我已经尝试过我在这里找到的严谨方法。 v = u[1].slice()
似乎是一个显而易见的选择,但它并不起作用,并且必须有一个比一些建议更容易的方法。
感谢您的帮助!
编辑:显然它是这样工作的,所以这里有更多的代码(没有一些不重要的部分):
var G = [[1, 2, 34, 56],[2, 345, 67, 8],[3, 4],[4, 65, 87]...]; // G contains 99 entries originally
var v;
var u;
var m = 99;
var alt;
var n = edges.length;
G[0].l = 0;
u = G[0].slice(); // now u = [1, 2, 34, 56]
u.l = G[0].l;
//... ...(some code not doing anything with v and u)
for (i = 1; i < ( u.length - 1 ) ; i++) {
alt = u.l + 1;
console.log(u[i]);
v = u[i];
u[i] = 9999999; //this is for testing if v is the ith of u or not
for( j = 0; j < m; j++) {
if(G[j][0] == v) {
if ( alt < G[j].l ){
Res[j].l = alt;
Res[j].previous = u;
}
}
}
for( j = 0; j < m; j++) {
if(G[j][0] == v) {
if ( alt < G[j].l ){
G[j].l = alt;
G[j].previous = u;
}
}
}
}
return v; //returns 9999999 instead of anythign from the original u, or G for that matter
答案 0 :(得分:0)
这两条线都在一个循环内:
从你的小提琴https://jsfiddle.net/7vjf82oa/1
//reduced to the core problem
while(/*whatever*/){
for(var i=1; i<u.length-1; ++i){
v = u[i];
u[i] = 9999999; //this is for testing if v is the ith of u or not
}
}
return v;
您将覆盖第一个迭代中的值,并在任何进一步的访问中访问它们。
您希望使用代码实现什么目标?它似乎在很多方面搞砸了。也许我们可以帮助解决潜在的问题。
喜欢这个部分:
for ( k = 0; k < m ; k++ ) {
if ( G[k].l < min ) {
mini = G[k][0];
u = G[mini].slice();
u.l = G[mini].l;
}
}
G.splice(mini, 1);
m--;
mini = 0;
mini
似乎引用了某些内容min
的索引位置。
您构建G的方式,G[k][0]
将引用G中的索引位置,mini = G[k][0]
可以替换为mini = k
,除非您从G中删除元素,因此索引完全混乱up,因此引用u = G[mini].slice()
会导致某种花哨的混乱。
除了周围情况永远不会成真的事实。为什么呢?
G[/*any*/].l
初始化为无限
u.l
初始化为0并且正在计数。
G[0].l = 0;
u = G[0].slice();
u.l = G[0].l;
//...
alt = u.l + 1;
//...
G[j].l = alt;
min
初始化为0,永远不会更改。
0..99和Infinite都不能低于0
因此G.splice(mini, 1);
只是G.shift();
再次,你想要建立什么?也许我们可以提供帮助
答案 1 :(得分:-1)
如果要克隆对象或深层副本, 有几种方法可以做到。
function clone(a) {
return JSON.parse(JSON.stringify(a));
}