You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
undefined, Functions, and Symbols are not valid JSON values. If any such values are encountered during conversion they are either omitted (when found in an object) or changed to null (when found in an array). JSON.stringify() can return undefined when passing in "pure" values like JSON.stringify(function(){}) or JSON.stringify(undefined).
JavaScript 的类型
基础类型: 基本数据类型:Undefined、Null、Boolean、Number、String 和 Symbol,变量是直接按值存放的,存放在栈内存中的简单数据段,可以直接访问。
引用类型:存放在堆内存中堆对象,变量保存的是一个指针,指向堆中的对象。
正因为这种机制,当我们复制引用类型的值时,其实是在栈中复制了一个新的指针指向堆中的对象,改变其中一个对象,另一个对象也会改变。
定义
浅拷贝:对对象的属性进行复制,并不会进行递归复制。因此对于基础类型会进行值的拷贝,对于引用类型只会进行地址的拷贝,最终两个指针指向同一个地址。其中一个对象属性修改,另一个对象也会进行属性的修改。
深拷贝:递归拷贝对象的所有属性
实现
浅拷贝
Array.concat
从下面的例子来看,改变引用类型的值,原数组也会跟着改变
类似的
Array.slice
、Array.from
也是同等效果Object.assign
依然是 改变引用类型的值,原数组也会跟着改变
自行实现
深拷贝
JSON.stringify/parse
发现会出现属性丢失的情况
在MDN中可以找到相关描述
也就是
undefined
、function
、symbol
会在转换过程中被自动忽略递归的方法
上述简单实现了深拷贝,但是缺少很多东西并且有部分漏洞
getOwnPropertySymbols-MDN
参考文章
The text was updated successfully, but these errors were encountered: