Javascript 末尾变量中的意外值
我在node.js上试了试,发现代码中有一个奇怪的行为。假设这是由于我缺乏异步编码的经验,我尝试用纯(同步)javascript进行复制,但结果相同。 下面是我的代码:Javascript 末尾变量中的意外值,javascript,Javascript,我在node.js上试了试,发现代码中有一个奇怪的行为。假设这是由于我缺乏异步编码的经验,我尝试用纯(同步)javascript进行复制,但结果相同。 下面是我的代码: function AddCurrWeek(agenda) { try { agenda["Tue"].push("Some event"); return agenda; } catch (error) { console.log(error); } };
function AddCurrWeek(agenda) {
try {
agenda["Tue"].push("Some event");
return agenda;
} catch (error) {
console.log(error);
}
};
function Initialize() {
var new_week = { "Sun": [], "Mon": [], "Tue": [], "Wed": [], "Thu": [], "Fri": [], "Sat": [] };
try {
return new_week;
} catch (error) {
console.log(error);
}
}
function Main() {
try {
var aPrec, aCurr
var aInit = Initialize();
aPrec = aInit;
// after this line < aPrec > is used no more.
// adding some data to < aInit > saving into a new variable:
aCurr = AddCurrWeek(aInit);
if (aCurr != aPrec ) {
console.log("Save changes...");
// but it is never different!!!!
}
console.log("> aCurr:", aCurr);
console.log("> aPrec:", aPrec);
// At the end, < aCurr > and < aPrec > share the same value!!!!
} catch (error) {
console.log(error);
}
};
Main()
每周功能(议程){
试一试{
议程[“星期二”]。推送(“某些事件”);
返回议程;
}捕获(错误){
console.log(错误);
}
};
函数初始化(){
var new_week={“Sun”:[],“Mon”:[],“Tue”:[],“Wed”:[],“Thu”:[],“Fri”:[],“Sat”:[];
试一试{
返回新的一周;
}捕获(错误){
console.log(错误);
}
}
函数Main(){
试一试{
var aPrec,aCurr
var aInit=Initialize();
aPrec=aInit;
//在此之后,不再使用。
//将一些数据添加到保存到新变量中的:
aCurr=ADDCURR周(aInit);
如果(aCurr!=aPrec){
log(“保存更改…”);
//但它从来都不例外!!!!
}
console.log(“>aCurr:”,aCurr);
控制台日志(“>aPrec:”,aPrec);
//最后,和共享相同的值!!!!
}捕获(错误){
console.log(错误);
}
};
Main()
请问,有人能告诉我为什么最后aCurr
和aPrec
共享相同的值,以及如何避免这种情况?
提前谢谢。
Denis变量名只是指向实际数据结构的指针,使用
var aInit=Initialize()只创建一次代码>
aPrec=aInit
没有复制数据结构的内容,它只是说aPrec
应该指向与aInit
相同的数据结构
注意console.log(“>aCurr:”,aCurr)的输出是如何进行的;控制台日志(“>aPrec:”,aPrec)代码>两者都包含“星期二:['某些事件']”?这是你的线索,agenda[“Tue”].push(“某个事件”)
在单个数据结构上运行,因为更改应用于aCurr
以及aPrec
您应该尝试为问题找到一个更好的标题,当前的标题不是很明确;)我不明白为什么你会期望aCurr
和aPrec
有所不同。我的意思是,代码字面上可以归结为let a={},b=a;a==b代码>,只是你在它周围放了一大堆冗长的代码。由于AddCurrWeek修改并返回其输入实例,两个变量都指向同一个对象,这是预期的行为。感谢Matt让我考虑“传递/指向”(抱歉,我的bat标题:不清楚,因为我的头脑不清楚)。因此,我不得不“克隆”我的var,而不是“复制”它。现在这么简单。。。但不是没有你的建议。更新如下:''函数AddCurrWeek(agenda){…var newAgenda=JSON.parse(JSON.stringify(agenda))返回newAgenda;}