这道题考查 js 的变量类型和计算。
js 六大数据类型:Number、String、Boolean、Object、null、undefined。
ES6 又引入了一种新的原始数据类型 Symbol,表示独一无二的值。
其中值类型包括 Number、String、Boolean、null、undefined、Symbol,引用类型包括 Object、Array、Function。
深拷贝代码
function deepClone(obj){
if(typeof obj !== 'object' || obj == null){
return obj //obj为值类型,直接返回
}
let res;
if(obj instanceof Array){ //判断obj为Array还是Object
res = []
}else{
res = {}
}
for(let key in obj){
if(obj.hasOwnProperty(key)){
result[key] = deepClone(obj[key])
}
}
return res
}
需要注意的点:
- typeof 用来判断值类型,但是无法判断 null,因为 typeof null 返回 Object;
- obj instanceof Array 判断 obj 是 Array 还是 Object,还可以用 Array.isArray(obj) 来判断;
- hasOwnProperty 是js中唯一一个处理属性,但是不查找原型链的函数。用来判断自身属性是否存在,返回boolean;
- for in 既可以遍历数组,也可以遍历对象,得到对象的 key 或数组的下标。
除了手写外,Object.create(obj) 也可以实现深拷贝,它通过原型链的方式,使用现有对象来提供新创建对象的__proto__。
new Object(obj) 这种写法可以实现浅拷贝。