900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 深浅拷贝知识点

深浅拷贝知识点

时间:2019-04-20 12:16:56

相关推荐

深浅拷贝知识点

js的数据类型分为基本数据类型与引用数据类型

深浅拷贝基本是在对引用数据类型才会产生影响

一、深浅拷贝的定义

浅拷贝:

只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存

深拷贝:

复制并创建一个一摸一样的对象,不共享内存,修改条新对象,旧对象保持不变

二、深浅拷贝的实现

浅拷贝:

(1)对象的浅拷贝

var obj = {

name: ‘zjs’,

age: 18

}

var obj2 = obj;

obj2.name = ‘yyq’

// 因为obj与obj2共用相同的内存地址,所以在对obj2的name进行修改的时候,obj的nae也会发生改变

(2)数组的浅拷贝

var arr = [1,2,3,‘4’]

var arr2 = arr;

arr2[1] = “test”

console.log(arr) // [1,‘test’,3,‘4’]

console.log(arr2) // [1,‘test’,3,‘4’]

// arr2是对arr的浅拷贝,两者的值发生变化时会互相影响

深拷贝:

(1)数组的深拷贝

在使用slice与concat对数组进行深拷贝的时候存在局限性

var arr = [‘a’,‘b’,‘c’];

var arrCopy = arr.slice(0);

arrCopy[0] = ‘test’

console.log(arr) // [“a”,“b”,“c”]

console.log(arrCopy) // [“test”,“b”,“c”]

// 使用js array中的slice对数组进行复制

// array.slice(start,end)

// 或者使用数组的concat(),对js的数组进行一个复制

(2)数组的深拷贝使用ES6的新特性

拓展运算符实现数组的深拷贝

var arr = [1,2,3,4,5]

var [ …arr2] = arr

arr[2] = 5

console.log(arr) // [1,2,5,4,5]

console.log(arr2) // [1,2,3,4,5]

(3) 对象的深拷贝

Object.assign()是介于深拷贝与浅拷贝之间的一种拷贝,在对象中的属性不是引用类型时可以实现深拷贝,但是如果对象中的属性属于引用类型此时,就不能实现深拷贝了。

// 拷贝对象中无引用类型属性

var a = {name : ‘miay’};

var b = Object.assign({},a);

console.log(a === b) //false

b.name = ‘chris’;

console.log(a.name) //miya

// 拷贝对象中存在引用类型的属性

var a = {name:{firstName:“tang”,lastName:“jiao”}}

var b = Object.assign({},a)

console.log(a === b); //false

b.name.firstName = “chen”

console.log(a.name.firstName) //chen

使用JSON.parse()和JSON.stringfy()对对象进行深拷贝

JSON.parse()的clone方法会忽略function和underfined的字段,且无法克隆Date类型

只能克隆原始对象自身的值,不能克隆它继承的值

· JSON.stringify() : 将JavaScript对象序列化为JSON字符串的值

· 语法:JSON.stringify(value[,replacer[,space])

· value:将要序列化为JSON字符串的值

· replacer:可选|过滤器的参数。(参数可能为数组、函数或null—)

· 数组:只有含有在这个数组中的属性名,才会显示

· 没有提供/null:则不过滤,属性全部显示

· space:可选|控制结果中的缩进和空白符。用于美化输出。(参数可能为数字或为null)

· 数字:上限为10,大于10则转换为10,大于10则取前10,替代空格显示

· 字符串:字符串长度最长不超过10个,大于10则取前10,替代空格显示

· 没有提供/null:没有空格

eg:

JSON.stringify({}); // ‘{}’

JSON.stringify(true); // ‘true’

JSON.stringify(“foo”); // ‘“foo”’

JSON.stringify([1, “false”, false]); // ‘[1,“false”,false]’

JSON.stringify({ x: 5 }); // ‘{“x”:5}’

JSON.stringify({x: 5, y: 6}); // “{“x”:5,“y”:6}”

JSON.parse()

功能:把JSON字符串解析为原生JavaScript对象

语法:JSON.parse(text[,reviver])

·text:要被解析为Javascript对象的字符串

·reviver:可选|函数,将在每个键值对上调用,用来修改解析生成的原始值,在parse返回之前调用

eg:

JSON.parse(‘{}’); // {}

JSON.parse(‘true’); // true

JSON.parse(‘“foo”’); // “foo”

JSON.parse(‘[1, 5, “false”]’); // [1, 5, “false”]

JSON.parse(‘null’); // null

由此先使用JSON.stringfy()先将对象转换为json格式的数据

var clone = function(obj){

return JSON.parse(JSON.stringify(obj));

}

var a = {

a:function(){console.log(‘hello world’)},

b:{c:1},

c:[1,2,3],

d:‘tang’,

e:new Date(),

f:null,

g:undefined

}

var b = clone(a);

console.log(b)

clone方法使用的parse和stringfy,会忽略function和undefined的字段,对date类型不支持,只能clone对象原始的值,并不能clone他继承的值

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。