对象是引用型、复合型数据,因此对象的操作主要包括引用、复制、克隆和销毁等。
对象是引用型数据,赋值操作实际上就是赋予地址。
下面示例定义一个对象 obj,然后赋值给 obj1 后,obj 就全等于 obj1,它们都引用同一个对象,也就是说它们的值都是同一个地址。
var obj = { //定义对象
x : true,
y : false
}
var obj1 = obj; //引用对象
console.log(obj1 === obj); //true,说明两个对象相同
console.log(obj1.x); //true
console.log(obj.x); //true
复制对象就是利用 for/in 遍历对象,然后把每个对象成员赋值给另一个对象。
在下面示例中,通过复制操作把 obj 的属性转移给 obj1 对象。
var obj = { //定义对象
x : true,
y : false
}
var obj1 = {};
for (var i in obj) { //遍历obj对象,把它的所有成员赋值给对象obj1
obj1[i] = obj[i];
}
console.log(obj1 === obj); //false,说明两个对象不同
console.log(obj1.x); //true
console.log(obj.x); //true
克隆对象也是一种复制操作,不过它的执行效率更高一些。
1) 封装一个克隆工具。为 Function 类型扩展一个原型方法。
var clone = function (obj) { //对象克隆方法
function Temp() {}; //新建空构造函数
Temp.prototype = obj; //把参数对象赋值给该构造函数的原型方法
return new Temp(); //返回实例化后的对象
}
2) 调用工具函数 clone() 把 obj 克隆给 obj1。
var obj = {
x : true,
y : false
}
var obj1 = {};
obj1 = clone(obj);
3) 检测对象 obj1,其拥有对象 obj 所有属性,但是它们不全等。
console.log(obj1 === obj); //false,说明两个对象不同
console.log(obj1.x); //true
console.log(obj.x); //true
这里通过直接赋值的方式把一个对象传递给另一个临时构造函数的原型对象,然后实例化类型函数,并返回这个实例对象,它拥有了参数对象的所有成员,但是不再与原参数对象保持联系。
JavaScript 能够自动回收无用存储单元,当一个对象没有被引用时,该对象就被废除了,JavaScript 会自动销毁所有废除的对象。把对象的所有引用都设置为 null,可以强制废除对象。
当对象不被任何变量引用时,JavaScript 会自动回收对象所占用的资源。
var obj = { //定义对象,被变量obj引用
x : true,
y : false
}
obj = null; //设置为空,废除引用