ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。
基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。
JavaScript中基本数据类型的赋值和函数传参是值传递,而引用数据类型的赋值和函数传参是引用传递。
// 实现一个函数clone,对JavaScript中的主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。
function
clone
(
obj
) {
let
copy
;
switch
(
typeof
obj
) {
case
"undefined"
:
break
;
case
"number"
:
copy
=
obj
-
0
;
break
;
case
"string"
:
copy
=
obj
+
""
;
break
;
case
"boolean"
:
copy
=
obj
;
break
;
case
"object"
:
// object分为三种情况 (null),对象(Object)和数组(Array)
if
(
obj
===
null
) {
// null类型被看做空对象指针,即空的对象引用。只有一个值,即null值,
所以,在用typeof 操作符去检测null类型的值时,结果是object类型。
所以,在用typeof 操作符去检测null类型的值时,结果是object类型。
copy
=
null
;
}
else
{
// 通过对象的原型判断传入参数是否为数组
// 通过对象的原型判断传入参数是否为数组
if
(
Object
.
prototype
.
toString
.
call
(
obj
).
slice
(
8
,
-
1
)
===
"Array"
) {
// String.slice(start,end) start参数为截取开始位置,end参数为结束位置
copy
=
[];
for
(
var
i
=
0
;
i
<
obj
.
length
;
i
++
) {
copy
.
push
(
clone
(
obj
[
i
]));
}
}
else if
(
Object
.
prototype
.
toString
.
call
(
obj
).
slice
(
8
,
-
1
)
===
"Object"
){
// 如果对象的原型是Object进行对象遍历
copy
=
{};
for
(
var
j
in
obj
) {
copy
[
j
]
=
clone
(
obj
[
j
]);
}
}
else
{
// [object Date],[object RegExp],[object Function] 不做处理
copy
=
Object
.
prototype
.
toString
.
call
(
obj
);
}
}
break
;
default
:
copy
=
obj
;
break
;
}
return
copy
;
}
数组对象的深拷贝:
var
clone =
function
(v) {
var
o = v.constructor === Array ? [] : {};
for
(
var
i
in
v) {
o[i] =
typeof
v[i] ===
"Object"
? clone(v[i]) : v[i];
}
return
o;
}