数据拷贝
- 数据存储
基本类型:存储在栈内存中 基本类型(6 种):Number/ String/ Boolean/ undefined/ null/ Symbol
引用类型:变量存储在栈内存中(变量存的地址),具体数据存储在堆内存中,通过地址链接 引用类型:Object(对象、数组、函数)
- 变量拷贝/传递
基本类型:拷贝的是存储在栈内存中的变量的值 引用类型:拷贝的是存储在栈内存中的变量的地址,堆内存中数据共享
- 浅拷贝–解决引用类型数据共享问题
拷贝对象:
- 对象的合并==> Object.assgin( {空对象}, 要复制的对象 )
- 遍历对象==>使用 for…in
拷贝数组:
- Object.assgin([ ], [要复制的数组 ] )
- 数组的内置方法 map、forEach 等
- 深拷贝–解决浅拷贝只能拷贝一层的问题
- JSON.stringify() 先将对象/数组转成字符串,改变数据类型,直接复制简单类型数据的值
- JSON.parse() 再将字符串转回对象、数组
例子://let newNum=JSON.parse( JSON.stringify( 被拷贝的变量 ) )
JSON 方法的缺点:
- 如果有时间对象,时间将只是字符串的形式,而不是对象的形式
- 如果 obj 里有 RegExp(正则表达式的缩写)、Error 对象,则序列化的结果将只得到空对象
- 如果 obj 里有函数,undefined,则序列化的结果会把函数或 undefined丢失
- 如果 obj 里有 NaN、Infinity 和-Infinity,则序列化的结果会变成 null
- 完美的深拷贝
Lodash 外部调用 < script src=“xxx”>< /script > 使用lodash的属性:let newNum = _.cloneDeep( 被拷贝的变量 )
|