赞
踩
1、JS数据类型
基本数据类型:Boolean、String、Number、null、undefined
引用数据类型:Object、Array、Function、RegExp、Date等
2、深拷贝与浅拷贝
深拷贝和浅拷贝都只针对引用数据类型,
浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;深拷贝会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
区别:浅拷贝只复制对象的第一层属性,而深拷贝会对对象的属性进行递归复制。
3、赋值
当把一个对象赋值给一个新的变量时,赋的对象是该对象在栈中的地址,而不是堆中的数据。也就是新旧两个对象指的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,两个对象联动的会一起改变。如下:
4.浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,对原有对象的成员进行依次拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址。因此如果新对象中的某个对象成员改变了地址,就会影响到原有的对象。如下:
浅拷贝方法:
(1)Object.assign()
Object.assign(target,...sources)
target:要拷贝给谁 source:要拷贝的对象
- let person = {name: 'kk'}
- let person1 = {
- age: 25,
- arr:[1,2,3],
- children:{
- son:1
- }
- }
- let person2 = Object.assign({}, person,person1)
- person2.age = 30 //不影响person1
- person2.arr[0] = 8 //影响person1
- person2.children.son = 2 //影响person1
-
- console.log('person1',person1)
- console.log('person2',person2)
(2)Array.prototype.concat()和Array.prototype.slice()
均为Array原型上的方法,只适用于Array。
- var arr1 = [1,3,{user: 'aaa'}]
- var arr2 = arr1.concat();
- //或者 var arr2 = arr1.slice()
- arr2[0] = 99;
- arr2[2].user = 'AAA';
- console.log('arr1',arr1)
- console.log('arr2',arr2)
5.深拷贝
对对象的属性中所有引用类型的值,遍历到是基本类型的值为止。
深拷贝方法:
(1)JSON.parse(JSON.stringify())
原理:用JSON.stringify()将对象转成字符串,再用JSON.parse()把字符串解析成对象。
- var obj1 = {
- 'name' : 'zhangsan',
- 'language' : [1,[2,3],[4,5]],
- };
- var obj2 = JSON.parse(JSON.stringify(obj1));
- obj2.name = "lisi";
- obj2.language[1] = ["二","三"];
- console.log('obj1',obj1)
- console.log('obj2',obj2)
修改obj2,obj1的值都没有改变。
这种方法可以实现数组和对象和基本数据类型的深拷贝,但不能处理函数。
(2)手写深拷贝函数(支持基本数据类型、Array、Object、原型链、RegExp、Date类型)
- function deepCopy(obj, parent = null) {
- let result
- let _parent = parent
- while(_parent) {
- if (_parent.originalParent === obj) {
- return _parent.currentParent
- }
- _parent = _parent.parent
- }
- if (obj && typeof(obj) === 'object') {
- if (obj instanceof RegExp) {
- result = new RegExp(obj.source, obj.flags)
- } else if (obj instanceof Date) {
- result = new Date(obj.getTime())
- } else {
- if (obj instanceof Array) {
- result = []
- } else {
- let proto = Object.getPrototypeOf(obj)
- result = Object.create(proto)
- }
- for (let i in obj) {
- if(obj[i] && typeof(obj[i]) === 'object') {
- result[i] = deepCopy(obj[i], {
- originalParent: obj,
- currentParent: result,
- parent: parent
- })
- } else {
- result[i] = obj[i]
- }
- }
- }
- } else {
- return obj
- }
- return result
- }
- //测试
- var obj1 = {x: 1}
- function construct(){
- this.a = 1,
- this.b = {
- x:2,
- y:3,
- z:[4,5,[6]]
- },
- this.c = [7,8,[9,10]],
- this.d = new Date(),
- this.e = /abc/ig,
- this.f = function(a,b){
- return a+b
- },
- this.g = null,
- this.h = undefined,
- this.i = "hello",
- this.j = Symbol("foo")
- }
- construct.prototype.str = "I'm prototype"
- var obj1 = new construct()
- obj1.k = obj1
- obj2 = deepCopy(obj1)
-
- obj2.b.x = 999
- obj2.c[0] = 666
-
- console.log('obj1', obj1)
- console.log('obj2', obj2)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。