<body>
<script type="text/javascript">
//公用的新题目对象。 问题点1
var newSubject = {
content:''
}
//题目集合
var subjectList = [];
//刚进入页面时默认有一个新题目
subjectList.push(newSubject);
//然后编辑这个题目
subjectList[0].content = 'X';
//再添加一个新题目
subjectList.push(newSubject)
//再编辑第二个题目
for (var i in subjectList) {
if (i == 1) {
var subject = subjectList[i];
subject.content = 'Y'; //问题点2
}
}
//输出整个题目集合,发现第一个题目也被编辑了
console.log('subjectList=');
console.log(subjectList);
//原因:数组是引用类型,数组变量存储在栈,元素数据存储在堆中,将数组赋值不同的对象,所有的赋值对象都指向堆同一个数据,所以改变其中一个数组中的元素,别的数组元素也会改变。
//解决:先把数组转换成字符串再转换成对象 ,这样会新分配一块内存,就不会指向同一个堆中的数据。例子1: var tmp = JSON.parse(JSON.stringify(array));
//本例中的subjectList.push(newSubject)应该改为subjectList.push(JSON.parse(JSON.stringify(newSubject)))
</script>
</body>
不过使用JSON.parse(JSON.stringify(array))时有注意事项