实现深度拷贝功能:
其中,有几点注意事项:
1、数组和对象的遍历方式:对象的遍历方式 for in 也适用于数组,因为数组也是特殊的对象。
2、如何判断对象、数组。
对象判断:typeof。可以判断六种基本数据类型:Number、String、Boolean、Object、Function、Undefined。可见其不能判断数组。
数组判断有以下几种方法:
(1) instanceof:主要用来判断某个实例是否属于某个对象。
origin instanceof Array 返回Boolean类型。
(2) constructor: 对象的构造函数属性。
origin.constructor == Array
以上两种方法存在一个小问题:跨框架页面中的数组,在不同的框架中创建的数组不会相互共享其prototype属性。
(3)Object.prototype.toString:每一个继承 Object 的对象都有 toString方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。虽然Array也继承自Object,但js在Array.prototype上重写了toString,而我们通过toString.call(arr)实际上是通过原型链调用了。
Object.prototype.toString.call(arr);//"[object Array]" 通过call指定arr数组为Object.prototype对象中的toString方法的上下文