网站开发 外包,上海企业网站建站,301重定向到新网站,xampp wordpress 建站教程今天在看React-native性能优化的时候#xff0c;看到如何避免shouldComponentUpdate的异常数据时#xff0c;脑内一阵风暴#xff0c;从而牵连出一连串的问题#xff0c;于是有了这一篇关于js数组的复制#xff08;深浅拷贝#xff09;与赋值等为何能产生异常数据的文章。…今天在看React-native性能优化的时候看到如何避免shouldComponentUpdate的异常数据时脑内一阵风暴从而牵连出一连串的问题于是有了这一篇关于js数组的复制深浅拷贝与赋值等为何能产生异常数据的文章。 有什么问题欢迎指正 现在进入正题 首先异常数据的产生在于我们在复制赋值时会有或没有改变到本身的值。 一、push与concat push的定义是:像数组末尾添加一个或更多元素并返回新的长度。该方法会改变数组的长度。 concat的定义是连接两个或更多的数组并返回结果该方法不会改变现有数组而仅仅会返回数组的一个副本。 var a [1,2];
a.push([3,4]);
a.concat(5);
//a为1 2 3,4 5 二、深拷贝与浅拷贝 1.浅拷贝 JavaScript存储对象都是存地址的所以浅复制会导致 a 和 b 指向同一块内存地址 数组的赋值其实相当于给了索引改变其中一个变量其他引用都会改变 var a [1,2,3];
var b a;
b[0] 4;
//a为4 2 3
//b为4 2 3 根据上面存储对象的问题这里就可以解决另一个问题 原始参数比如一个具体的数字被作为值传递给函数值被传递给函数如果被调用函数改变了这个参数的值这样的改变不会影响到全局或调用函数。 你传递一个对象在js里数组不是简单数据类型而是对象到一个函数如果在函数里面改变了这个参数的内容在外部这个变化是可见的。 2.深拷贝 1slice 函数 2concat 函数 3assgin 三个函数的原理都是返回数组的一个副本相当于另外开辟内存空间所以并不会改变数组本身的的值 但是这里有一点不同就是assgin与其他两点的不同 虽然说assgin也是深拷贝但是他只是第一层深拷贝第二层之后还是进行浅拷贝例子如下 var a { a1:{ aa1:11, aa2:22 }
}
var b Object.assgin({},a);
var c Object.assgin({},a);
b.a1.aa1 33;
/*
b:{ a1:{ aa1:33, aa2:22 }
}
c:{ a1:{ aa1:33, aa2:22 }
}
*/ 转载于:https://www.cnblogs.com/ZpandaZ/p/7396974.html