jQuery中splice修改数组致关联数组同步变更,如何保留初始数组?
解决数组赋值后同步修改的问题
这是个非常常见的JavaScript引用类型陷阱!你遇到的问题根源在于:数组属于引用类型,当你执行var $new_questions2 = $new_questions;的时候,并没有复制出一个新数组,而是让$new_questions2和$new_questions指向了内存中的同一个数组对象。所以不管你通过哪个变量修改数组,两个变量都会看到变化后的结果。
要保留$new_questions2的初始值,你需要创建原数组的浅拷贝,这里有几种简单可靠的方法:
方法1:使用slice()方法
slice()方法如果不传参数(或者传0作为起始索引),会返回一个包含原数组所有元素的新数组:
var $new_questions2 = $new_questions.slice();
方法2:使用ES6扩展运算符
这是最简洁的写法,把原数组的元素展开到新数组中:
var $new_questions2 = [...$new_questions];
方法3:使用Array.from()
ES6新增的方法,专门用于从现有可迭代对象(包括数组)创建新数组:
var $new_questions2 = Array.from($new_questions);
方法4:使用concat()方法
老版本JS也支持的写法,通过空数组和原数组拼接生成新数组:
var $new_questions2 = [].concat($new_questions);
修改后的完整代码示例
拿slice()方法举例,修改后代码如下:
$(document).ready(function(){ var $new_questions = [1,2,3,4,5]; var $new_questions2 = $new_questions.slice(); // 创建数组拷贝 $new_questions.splice(2, 2); $("#array_values_1").html($new_questions.toString()); $("#array_values_2").html($new_questions2.toString()); });
此时$new_questions会变成[1,2,5],而$new_questions2会保留初始的[1,2,3,4,5],完美解决你的问题!
内容的提问来源于stack exchange,提问作者Jaadu




