改变局部variables的值执行原始全局variables值的变化

在我的节点js程序在路由中创build了数组名为列表。 我已经赋值给模型中声明的函数的数组。 路线代码是:

var express = require('express'); var router = express.Router(); var questionModel = require('../model/questionModel'); var userModel=require('../model/userModel'); /* GET home page. */ router.get('/', function(req, res, next) { //declare an array and store the json data var list=questionModel.getAllQuestions(); for(i=0;i<list.length; i++){ console.log(list[i].submitter); console.log(userModel.getUserById(list[i].submitter)[0]); list[i].submitter=userModel.getUserById(list[i].submitter)[0].fname; } console.log(list); //respond with the array res.json(list); //res.redirect("../question/" + this_id); }); module.exports = router; 

在这里模块我使用本地variables,因为在这个类项目我没有使用任何数据库。 我的所有模型都从一个全局variables中获取值。

此代码在第一次请求时工作正常。 但首先要求改变list [i] .submitter本地值的全局值变化值。

当我收到第二个请求时,全局值的变化会产生问题。 在第二个请求从questionModel.getAllQuestions返回值是不必要的更新。

数组总是在javascript中通过引用传递。 这就是为什么当你编辑数组会影响原始数组。

在你的情况下,虽然你正在制作一个questionModel的副本,但你得到的是你的数组中的对象列表。 这两个数组中的对象引用将引用同一个对象。

所以你对list[i].submitter也会影响原始对象。

如果你不想更新发生,那么你需要深入复制数组内的对象,如下所示:

 function deepCopy (arr) { var out = []; for (var i = 0, len = arr.length; i < len; i++) { var item = arr[i]; var obj = {}; for (var k in item) { obj[k] = item[k]; } out.push(obj); } return out; } 

// testing用例

 var questionsModelOriginal = [ {'a' : 1, submitter : "Rias"}, {'b' : 2, submitter : "SO"} ]; var questionsModelCopy = deepCopy(questionsModelOriginal); 

现在,如果您更改questionsModelCopy中的问题属性,则不会修改全局问题模型。

参考SO