JavaScript即学即用教程[6]-普通对象操作

属性特性

对象的属性也有自己的特性,通过Object.getOwnPropertyDescription(obj, attName)可以查看。所以属性的特性其实也可以叫做属性的描述符。

凡是属性描述符中的configuable为true的属性,才可以delete。如Object.prototype就不可以delete。

obj.propertyIsEnurerable可以判断属性是否可枚举。

通过描述的方式来给对象定义属性,可以通过 Object.defineProperty(obj, ‘name’, {}) 的方式来实施。

遍历对象

可以通过for in 来遍历,for in也会遍历到对象的原型链上的属性。 而Object.keys()可以获取到对象上自有的所有属性的key值,返回的是key值组成的数组。

对象深度克隆

考察知识点比较多,考到了对象遍历,对象类型判断,递归,以及普通对象操作的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function deepClone (obj) {
// function赋值也是指针传递,只是由于function不可更改,所以浅复制后也不会对原对象造成影响

if(typeof obj !== "object") {
return obj; //原始类型以及函数类型,直接返回,相当于克隆
}
var o = isArray(obj) ? [] : {};
// 利用 for in 既可以遍历对象又可以遍历数组
for(i in obj) {
if(obj.hasOwnProperty(i)){
// 判断源对象obj的某属性是不是指向源对象自身(循环引用),
// 如果是,则不继续往下递归了(会栈溢出),就直接让新对象o的该属性也指向o自身就完了。
o[i] = (obj[i] === obj) ? o : deepClone(obj[i])
// 下面是没有解决循环引用问题的版本
// o[i] = deepClone(obj[i]);
// 下面是在这里处理function类型的版本
// o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
}
}
return o;
}