基本数据类型和引用数据类型,以及深拷贝和浅拷贝

数据类型:JS分为两种基本数据类型引用数据类型

基本数据类型: Number、String、Boolean、Null、Undefined、Symbol

(1)基本数据类型(存放在栈中)

基本数据类型是指直接存放在栈中的简单数据段,数据大小确定,内存k空间可分配,按值存放和访问
注:栈(stack)和堆(heap)

   a.stack为自动分配内存空间,它由系统自动释放。

   b.heap为动态分配内存,大小也不一定释放。

 这里顺带介绍一下数据类型symbol

数据类型Symbol,.表示独一无二的值,只要是属性名是属于Symbol类型,就都是独一无二的,保证不会与其他属性名产生冲突。它是JavaScript语言的第七种数据类型。ES5(ECMAScript第五个版本现在已更新到ES6、ES7)的对象属性名都是字符串。很容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(新模式)选的名字就有可能与现有方法产生冲突。

这时symbol就诞生了:

symbol起因:如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6增加Symbol的原因。

用法:

let s = Symbol()
typeof s
"symbol"

代码解析:在上述代码中,变量s就是一个独一无二的值。typeof运算符的结果,表明
变量s是Symbol数据类型,而不是字符串之类的其他类型。 

引用数据类型:Object(JS中除了基本数据类型,其他都是对象。例如数组、函数、正则表达式等)

(2)引用数据类型(存放在堆内存中的对象)

a.引用类型实际上是保存在堆内存中的对象,变量其实是保存在栈内存中的一个指针(这指针指向堆内存)

b.变量实际上在栈中,保存的是堆的引用地址。


 深拷贝浅拷贝

a.深拷贝和浅拷贝都是针对的引用数据类型

浅拷贝:修改拷贝之后的值会影响原来数据的值,就是只进行一层拷贝,就是只复制引用,而未复制真正的值,只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据。例如:Object.assign()

深拷贝:修改拷贝之后的值不会影响原来数据的值,就是无限层级拷贝,是对目标的完全拷贝,不像浅拷贝那样只是复制了一层引用,就连值也都复制了,对拷贝之后的数据进行修改不会影响到原数据。

b.JavaScript存储引用数据(对象)都是存地址的

所以浅拷贝会导致 obj1 和obj2 指向同一块内存地址。改变其中一方的内容,都是在原来的内存上做修改会导致拷贝对象和源对象都发生改变,

而深拷贝是开辟一块新的内存地址,将原对象的各个属性逐个复制进去。对拷贝对象和源对象各自的操作互不影响。

浅拷贝方法:

a:es6实现对象浅拷贝:object.assign({},a),

var obj = {name:'123',age:13};
var obj2 = Object.assign({},obj);

b:实现数组浅拷贝:slice,concat

深拷贝方法:

a:利用json的parse和stringfly

b:利用递归实现每一层的重新创建并赋值,很多时候可以用递归代替循环,递归是在函数里面把函数自己给调用一遍


注:

  1. 对象就不适用用Json.parse和stringfly,因为Undefined、Symbol,function会在转换过程中忽略。
  2. 展开运算符...也可以实现拷贝,不过既不属于浅拷贝也不属于深拷贝,因为只能拷贝第一层,第二层就不行了。
JSON.parse(JSON.stringify(obj))深拷贝的问题:
1、如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了
字符串。
2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
3、如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
5、JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数
生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor
6、如果对象中存在循环引用的情况也无法正确实现深拷贝。

建议项目中使用Lodash。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值