我使用node.js和express。爲什麼對象的引用被替換爲其值
我在'req.session
'上保存了一個包含對象數組的複雜對象。另外我保存對數組中其中一個對象的引用。 例如:
var value = {
name: "name"
, values: []
};
req.session.value = value;
//
// I populate 'req.session.value' with values (with the same structure)
//
// then I save reference to one of the inner objects
var currentValue = req.session.value[3];
//
// later I try to change the save object
//
currentValue.name = "newName";
我預計,如果我改變了「currentValue
」,那麼「req.session.value[3]
」也將被改變。但是,由於某種原因,它不會發生。
要具體,如果我改變currentValue
後我給你它那麼req.session.value[3]
改變,但如果我在未來的呼叫做,然後就在currentValue
改變。
在這個例子中:我做任務到「req.session
」中的「app.get(...)
」如果我改變了「app.get(...)
」它運行正常(價值在兩地改變)currentValue
的價值,但如果我在'app.post(...)
'中更改它,更改的唯一對象是currentValue
而req.session.value[3]
保持不變。
由於提前,
曬
的代碼:
'app.get("/template/:templateid/feature/add", isTemplate, function(req, res) {'
' if (!req.session.features) { // if features empty'
''
' // Save the first features level from the current template in the session '
' req.session.features = req.session.template.feature;'
' //'
' if (!req.session.featureNodes) { // featureNotes is a stack/branch of the features'
' req.session.featureNodes = [];'
' }'
' if (!req.query.featureroot || req.query.featureroot == "") {'
' } else {'
' var featureRoot = getFeature(req.query.featureroot, req.session.features); // get one object from req.session.features'
' if (featureRoot) {'
' req.session.featureNodes.push(featureRoot); // save reference'
' var featureR = req.session.featureNodes.pop(); // do check that work!'
' var values = {'
' name: "req.body.name"'
' , description: "req.body.description"'
' , wieght: "req.body.wieght"'
' , created: new Date()'
' , modified: new Date()'
' , feature: []'
' };'
''
' featureR.feature.push(values); // also req.session.features changed'
' req.session.featureNodes.push(featureRoot); // push the reference back for use later'
' } '
' }'
' res.render("addfeature2template.jade", { '
' title: "Add new feature"'
' ,template: req.session.template'
' ,feature: req.session.featureNodes'
' });'
'});'
''
'app.post("/feature/add", isUser, function(req, res) {'
' var SUBMIT = "Create";'
' var CANCEL = "Cancel";'
' switch (req.param("feature")) {'
' case SUBMIT:'
' var fields = { name: 1, description: 1, wieght: 1};'
' var values = {'
' name: req.body.name'
' , description: req.body.description'
' , wieght: req.body.wieght'
' , created: new Date()'
' , modified: new Date()'
' , feature: []'
' };'
' if (req.session.featureNodes.length < 1) {'
' req.session.features.push(values);'
' } else {'
' var featureRoot = req.session.featureNodes.pop(); // pop the reference'
' featureRoot.feature.push(values); // change the object but the req.session.features didnt changed '
' }'
' req.session.template = template;'
' res.redirect("/template/" + req.body.templateid);'
' break;'
' case CANCEL:'
' res.redirect("/template/" + req.body.templateid);'
' break;'
' }'
'});'
如果'req.session.value [3]'作爲一個字符串開始,那麼在任何情況下* ever *都不會*在分配對'req.session.value [3]有任何影響後再次更改'currentValue' ]'。這只是JavaScript的工作方式;如果你認爲你看到了這種情況,那麼你就會誤解某些東西(很難說出你發佈的內容)。 – Pointy
oops,我寫道:「var currentValue = req.session.value [3];」但我修正「var currentValue = req.session.value.values [3];」 - 現在是否合理? – user1798168
JavaScript中的賦值語句總是隻是複製值。你不能讓一個變量成爲另一個變量或對象屬性(這是數組元素)的別名。 – Pointy