JS对象克隆
2017-11-14 本文已影响9人
饥人谷_米弥轮
-
原始数据类型(5种):undefined null number string boolean
-
引用数据类型(1种):
- 虽然引用数据类型只有1种,但是它可以将多种原始的数据存在一个单元中,这也就是为什么它被称为“复合数据类型”,也就是对象——Object。
-
原始数据类型和引用数据类型的区别:
- 首先咱们先来看下它的概念,概念如果看不太明白,没有关系,我会在之后举例。
- 原始数据类型:在内存中,存放在栈中的简单数据段,也就是说,他们直接存储在变量访问的位置。
- 引用数据类型:在内存中,存放在堆中的对象,就是说,存储在变量处的值是一个指针,指向存储对象的内存处。
-
举例说明:
- 原始数据类型就像一个文件,我们可以直接找到并打开的过程。
- 引用数据类型就像一个文件的快捷方式,我们是通过快捷方式找到文件的位置,打开的过程。
<script>
function clone(obj) {
var o
if (obj instanceof Array) {
o = []
let len = obj.length
whlie(len--) {
o[len] = clone(obj[len])
}
return o
} else if (obj instanceof Object) {
o = {}
for (let key in obj) {
o[key] = clone(obj[key])
}
return o
} else {
return obj
}
}
// 代码优化
function clone2(obj) {
let o = obj instanceof Array ? [] : {}
for (let key in obj) {
if (obj[key] instanceof Object) { //判断对象中是否还有对象,有,继续递归
o[key] = clone2(obj[key])
} else {
o[key] = obj[key] //只要不是对象就直接放进去
}
}
return o
}
// 代码再优化
function clone3(obj) {
let o = obj instanceof Array ? [] : {}
for (let key in obj) {
o[key] = obj[key] instanceof Object ? clone3(obj[key]) : obj[key]
}
}
</script>