js数组赋值但是不改变原数组(用js代码实现移出数组arr[1,2,3,4,2,5,6,2,7,2]中与2相等的元素,并生成一个新的数组,不改变原数组)
本文目录
- 用js代码实现移出数组arr[1,2,3,4,2,5,6,2,7,2]中与2相等的元素,并生成一个新的数组,不改变原数组
- js 数组反转, 不改变原来的数组
- js数组赋值,不修改原数组,注意区分深、浅拷贝!踩坑!
- js中,关于数组赋值变化问题var arr = [1,4,5,9,0];var t =arr.随便一种方法();
- js数组复制(不改变原数组)
用js代码实现移出数组arr[1,2,3,4,2,5,6,2,7,2]中与2相等的元素,并生成一个新的数组,不改变原数组
es6有一个filter呀。
let arr = ;let newArr = arr.filter(item =》 item === 2);//
不过这没意义呀,输出的是一个数组 。要是输出原数组2的index还可以。
let arr = ;let newArr = ;arr.forEach((current, index) =》 { if (current === 2) { newArr.push(index); }})
js 数组反转, 不改变原来的数组
array.reverse(), 会改变原来的数组, 并返回该数组 如果要不改变原数组, 需要完全复制一份新的数组
js数组赋值,不修改原数组,注意区分深、浅拷贝!踩坑!
近日在写一个新功能的时候,其实没有很难,数据交互有一点复杂,发灰度之后,自测出一个小bug,虽然整体上似乎无伤大雅,但是发现了就犯强迫症想要解决,仔细debug了一晚上+一上午,甚至把自己组件拆分,数据传递的逻辑都重新理了一遍,实在没发现什么问题,一直看断点,数据在某一个阶段没有按照理想的状态变化,但是一直没明白是为什么,原本没往深浅拷贝的方面去想,一直纠结于各个组件之间的state的变化等等,最后突然灵光了一把,原来是这么小的错误,可把我愁了半天。就是某onchange函数中 把state里的数组赋值给新的变量,新的变量对数组做了一些操作,但却把state里面原本的值也修改了 (这是之前一直没发现的),正好其他地方state里的此数组是需要修改的,所以整体上似乎没产生什么影响,但在那个onchange函数里就改变了,会影响第一次渲染之后的再次渲染数据显示有错误。解决了也是终于舒畅了~特此记录,一定要重视对象的深浅拷贝!!一不小心就用错了酿成大祸! js中储存对象都是存引用地址,所以浅拷贝会导致两个变量指向同一块内存地址。数组的赋值其实相当于给了索引,改变其中一个变量其他的引用其他都会改变。如下为浅拷贝 // var a = // var b = a //此步不是赋值,而是将a的引用赋给b,所以改变b也会改变a // b=4 // a为 // b为 总的来说 :原始参数(比如一个具体的数字)被作为值传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。但当你传递一个对象(js里数组也是对象)到一个函数,如果在函数里面改变了这个参数的内容,那么这个改变在外部是可见的,也就是会影响到全局。 深拷贝数组的方法: (1)slice函数,newArr = arr.slice(0) (2)concat函数,newArr = .concat(arr,arr2,...) (3)assign函数(对象),newObj = object.assign({},obj) 但以上三种方式都是对对象第一层的深拷贝,第二层之后还是浅拷贝,要实现多维数组的深拷贝可以用: newArr = JSON.parse(JSON.stringify(arr))
js中,关于数组赋值变化问题var arr = [1,4,5,9,0];var t =arr.随便一种方法();
这是因为把一个数组直接赋值给一个变量,所赋值的只是数组的指针(或者说内存地址),两者实际上仍然是同一个数组(或者说同一个对象),改变其中一个的顺序,另一个的顺序也会跟着改变。就好比同一个人有两个不同号码的身份证一样,用不同的身份证不等于这个人就变成另一个人!如果你希望赋值后的数组(比如t)是原数组(比如arr)的复制品(或者说克隆体)而不是同一个,就应该新建一个空数组,然后把原数组的每个元素逐个复制到新数组中,而不能够想当然地用等于号直接赋值!
js数组复制(不改变原数组)
需要从后台取出数据,在前台接收并要保存在一个全局变量,因为之后还要对此使用此全局变量。 全局变量 var globalarr = ; 后台取出的数组变量 var arr = ; 一般情况下如果使用等号赋值,会连同原数级的地址复制,如果在此后操作原数组,会影响原数组的元素。 例 1:(赋值且复制数组地址) var globalarr = arr; // 此处globalarr 和 arr 一样拥有三个对象数组元素,且globalarr和arr 同享内存地址。 console.log( globalarr ); console.log( arr ); // 上面的打印结果如下: // 新建一个对象数组ms,并push进globalarr,打印出,看到globalarr和arr都改变。 var ms = {}; ms.id="10";ms.price=’1000.00’; globalarr.push(ms); console.log(globalarr);console.log(arr); // 再打印的结果如下: 这时,发现只单独push元素到gloalarr中,原数组arr 也发生了改变。 例 2:(只赋值不复制数组地址方法一) var globalarr = ;var arr = ; globalarr = arr.slice(); // 我们用slice函数来赋值数组 var ms = {};ms.id="10"; ms.price=’1000.00’; globalarr.push(ms); console.log(’ms-globalarr=》’,globalarr); console.log(’ms-arr=》’,arr); 我们发现slice函数赋值是不会影响原数组的。 例 3:(只赋值不复制数组地址方法二) var globalarr = ;var arr = ; for(vari in arr ) { var v = arr; var obj = {}; obj.id= v.id; obj.price= v.price; globalarr.push(obj); } var ms = {}; ms.id="10"; ms.price=’1000.00’; globalarr.push(ms); console.log(’ms-globalarr=》’,globalarr); console.log(’ms-arr=》’,arr); 例4:(只赋值不复制数组地址方法三) var globalarr = ;var arr = ; var x = globalarr.concat(arr); var ms = {}; ms.id="10"; ms.price=’1000.00’; x.push(ms); console.log(’after=》x’,x); console.log(’after=》arr’,arr);
更多文章:
北斗卫星导航地图免费下载(北斗卫星导航免费官方下载是真的吗)
2024年4月6日 03:25
Win8.1设置个性主题详细教程?手机QQ空间个性化主题背景和挂件怎么设置
2024年6月9日 08:48
和平精英体验服官网(和平精英突变团竞2.0体验服在哪里下载)
2024年8月19日 02:15
赛车游戏大全免费下载(求赛车游戏手游排行,有哪些比较推荐的)
2024年7月20日 09:45
金山打字通怎么打字作弊(我们学校有速度测试,就是打一篇文章,有没有作弊版的金山打字通呢)
2024年8月25日 18:30
ofd文件用什么软件打开(电脑上的ofd格式文件如何打开呢)
2024年8月5日 10:46