思路
- 判断类型,如果是基本数据类型,直接返回;如果是引用数据类型,浅拷贝一个新值代替原来的值;
- 遍历浅拷贝的对象,检测这个浅拷贝的对象的属性值有没有是引用数据类型,如果是,递归拷贝;
- 记录被拷贝的值,避免循环引用
- 需要忽略原型
代码
1 | // 判断是否基本数据类型 |
其他
js中遍历一个对象的属性的方法
Object.keys()
返回自身可枚举属性,不包括继承属性,不包括Symbol属性Object.getOwnerPropertyNames()
返回自身可枚举和不可枚举属性,不包括Symbol属性Object.getOwnerPropertySymbols()
返回自身Symbol属性for..in
遍历对象自身和继承的可枚举属性,不包括Symbol属性Reflect.ownKeys()
返回对象自身所有属性,不管是否可枚举,包括Symbol属性,不包括继承属性
使用 toString() 检测对象类型
- 可以通过
toString()
获取每个对象的类型 Object.prototype.toString.call(value)
或Object.prototype.toString.apply(value)