1. 使用递归
let str = "我是string基本数据类型"
let arr = [1, 6, [1, 3, 5, 7, 9], 5, 8, { a: 4, b: 7 }, 9, 0]
let obj = { a: 1, b: 2, c: 3, d: [123, 456], e: { ea: 789, eb: 666 } }
let nu = null
function deepClone(ob) {
if (typeof ob === "object") {
if (Object.prototype.toString.call(ob).slice(8, -1) === 'Null') return ob
if (ob instanceof Array) {
// 数组
let newArr = []
ob.forEach((item, index, arr) => {
newArr[index] = deepClone(item)
})
return newArr
} else {
// 对象
let newObj = {}
// for (let k in ob) {
// newObj[k] = deepClone(ob[k])
// }
Object.keys(ob).forEach((key, index, arr) => {
newObj[key] = deepClone(ob[key])
})
return newObj
}
} else {
return ob
}
}
console.log(deepClone(str))
console.log(deepClone(arr))
console.log(deepClone(obj))
console.log(deepClone(nu))
2. JSON.parse()和JSON.stringify()
JSON.stringify() // 将对象转化为json字符串
JSON.parse() // 将json转化为json对象
console.log(JSON.parse(JSON.stringify({a: 1, b: [4,5,6]})))
该方法可能会出现如下问题
- undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略
- Date 日期调用了 toJSON() 将其转换为了 string 字符串(Date.toISOString()),因此会被当做字符串处理。
- NaN 和 Infinity 格式的数值及 null 都会被当做 null。
- 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。
- 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
请谨慎使用
评论 (0)