帝国网站管理 上一条 下一条 链接 信息id 信息发布时间,安全员证查询网上查询,查看网站的外链,百度下载并安装到桌面为什么要进行深拷贝JS中的变量在内存中存储分为值类型和引用类型#xff1a; 值类型#xff1a; 1、占用空间固定#xff0c;保存在栈中#xff1b; 2、保存与复制的是值本身#xff1b; 3、基本类型数据是值类型#xff08;String,Number,undefined,Boolean,Null#x…为什么要进行深拷贝JS中的变量在内存中存储分为值类型和引用类型 值类型 1、占用空间固定保存在栈中 2、保存与复制的是值本身 3、基本类型数据是值类型String,Number,undefined,Boolean,Null 引用类型 1、占用空间不固定保存在堆中 2、保存与复制的是指向对象的一个指针 3、使用new()方法构造出的对象是引用型 所以像Object, Array 这样的复杂对象的需要进行深拷贝JOSN.stringify() 深拷贝有什么问题最简单的深拷贝呗方式就是使用JSON.stringify()进行深拷贝比例var obj{name:大雄,age:21
};
var obj1JSON.parse(JSON.stringify(obj));
这样深拷贝出来是完全没有问题的假如我们有如下的对象进行深拷贝呢var obj1{name:大雄,say:function(){console.log(我会说话哦);},birthday:new Date(1990/01/01)
};
var obj2JSON.parse(JSON.stringify(obj));
console.log(obj2);
// {name: 大雄, birthday: 1989-12-31T16:00:00.000Z}
我们看到了当我们的对象中有函数和日期类型是日期类型被转化成了字符串函数属性直接没有了是不是问题很大经过我们测试我们发现 1. undefined、任意的函数以及 symbol 值在序列化过程中会被忽略 2. Date 日期调用了 toJSON() 将其转换为了 string 字符串Date.toISOString()因此会被当做字符串处理。 3. NaN 和 Infinity 格式的数值及 null 都会被当做 null。 4. 其他类型的对象包括 Map/Set/WeakMap/WeakSet仅会序列化可枚举的属性。5. 对包含循环引用的对象对象之间相互引用形成无限循环执行此方法会抛出错误。// 下面就是循环引用
var obj1 {x: 1, y: 2
};
obj1.z obj1;
var obj2 JSON.parse(JSON.stringify(obj1)); // 栈溢出抛出错误
所以当我们要克隆的对象里面还有引用类型时我们只能采用递归的方法进行遍历了这里就不展开了。JOSN.stringify() 有几个参数 JSON.stringify(value[, replacer [, space]]) 我们主要看一下 第二个参数和第三个参数时干啥用的 replacer 可选1. 如果该参数是一个函数则在序列化过程中被序列化的值的每个属性都会经过该函数的转换和处理; 2. 如果该参数是一个数组则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;3. 如果该参数为 null 或者未提供则对象所有的属性都会被序列化; var obj1{x:1,y:2
};
var obj2JOSN.stringify(obj1,function(key,value){if(typeof value number){return value*2}return value;
});
// {x:2,y:4}
我们再看一下 最后一个参数space 可选1、指定缩进用的空白字符串用于美化输出pretty-print 2、如果参数是个数字它代表有多少的空格 举个例子var obj1{x:1,y:2};
JSON.stringify(obj1,null,t);
{x: 1,y: 2
}
我我们用制表符来进行缩紧原创不易请大家点赞关注十分感谢