对象
定义
对象就是一个存储着若干键值对的容器(查找速度快)
key的类型必须是字符型或symbol型;
var obj={"a":1,5:10,true:{}}
对象名.属性的形式可以修改属性值或增加键值对,前提:该属性必须是已知的字符型;
属性为非字符形时:
使用对象名[“属性名”],通过隐式转换成字符型来操作键值对;
当属性为变量时:
使用属性名[变量名] 如:
obj【key】 此时会将变量的值作为对象obj的属性;另一种写法就是直接在对象内部使用【key】;
对象没有长度,但在js中存储是有序的,按照先后顺序;
对象的存储
对象是以引用地址的形式存储在栈中的变量;对象内容也许会一样,但地址一定不一样,因为这是两个对象
var a={b:2};
var c=a;
a={b:2};
a.b=4
console.log(c) //b:2
console.log (a) //b:4
对象的遍历
prop是一个变量;
for(var prop in obj){
//遍历对象的属性名——key
}
prop——指代对象第一层中的每一个属性
obj【prop】——指代对象的属性值value
栈和堆
变量名存储在栈中,对应的值类型有字符型,数值型,布尔型,未定义型,symbol型,这些值可以存在栈中;
引用类型都存储在堆中,在堆中以一个引用地址来存值,将引用地址赋值给栈中的变量
注意对 对象的改变会提升在语句块前边,但在显示时会有缓存问题
内存泄漏
运行时不断创建对象,这些对象不做垃圾回收就会造成内存泄漏;
垃圾回收
当一个对象不再使用,这个对象引用地址复制的所有变量的值设为null,当内存超出一定值,系统会自动将这些没有引用地址的对象回收。
delete
可以删除对象中的属性,但无法删除全局变量的值
对象浅复制
方法一:
目标obj【prop】=源obj【prop】
目标建立一个空对象
将源对象键值对遍历
将属性赋值给属性,属性值赋值给属性值——obj【prop】=目标obj【prop】。
方法二:
目标建立空对象
使用Object.assign(目标,源);
var o={a:1,b:2,c:{value:10}};
var o1={};
Object.assign(o1,o);
console.log(o1)
o.a=10; //o1 a:1;说明复制成功
o.b=20; //o1 b:2说明复制成功
o.c.value=100; //o1 c:100 复制失败;因为o1只复制了o中c的引用地址,并没有将c中的键值对复制过来;
o.c和o1.c指向同一个对象。
对象中的属性都转化为字符串的深复制
var 新对象=JSON.parse(JSON.stringify(源对象))