pc站转换手机网站百度查询网
认识对象
- 对象(object)是“键值对”的集合,表示属性和值的映射关系。
对象的语法
- k和v之间用冒号分隔,每组k:v之间用逗号分隔,最后一个k:v对后可以不书写逗号。
属性是否加引号
- 如果对象的属性键名不符合JS标识符命名规范,则这个键名必须用引号包裹
属性的访问
- 可以用“点语法”访问对象中指定键的值。
- 如果属性名不符合JS标识符命名规范,则必须用方括号的写法来访问。
- 如果属性名以变量形式存储,则必须使用方括号形式。
属性的更改
- 直接使用赋值运算符重新对某属性赋值即可更改属性。
属性的创建
- 如果对象本身没有某个属性值,则用点语法赋值时,这个属性会被创建出来。
属性的删除
- 如果要删除某个对象的属性,需要使用delete操作符。
对象的方法
- 如果某个属性值是函数,则它也被称为对象的“方法”。
方法的调用
- 使用“点语法”可以调用对象的方法。
方法和函数
- 方法也是函数,只不过方法是对象的“函数属性”,它需要用对象打点调用。
对象的遍历
- 和遍历数组类似,对象也可以被遍历,遍历对象需要使用for...in...循环。
- 使用for...in...循环可以遍历对象的每个键。
对象的深浅克隆
对象是引用类型值
对象是引用类型值,这意味着:
- 不能用var obj2 = obj1这样的语法克隆一个对象。
- 使用==或者===进行对象的比较时,比较的是它们是否为内存中的同一个对象,而不是比较值是否相同。
对象的浅克隆
- 浅克隆:只克隆对象的“表层”,如果对象的某些属性值又是引用类型值,则不进一步克隆它们,只是传递它们的引用。
- 使用for...in...循环即可实现对象的浅克隆。
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </head><body><script>var obj1 = {a: 1,b: 2,c: [44, 55, 66]};// 实现浅克隆var obj2 = {};for (var k in obj1) {// 每遍历一个k属性,就给obj2也添加一个同名的k属性// 值和obj1的k属性值相同obj2[k] = obj1[k];}// 为什么叫浅克隆呢?比如c属性的值是引用类型值,那么本质上obj1和obj2的c属性是内存中的同一个数组,并没有被克隆分开。obj1.c.push(77);console.log(obj2); // obj2的c属性这个数组也会被增加77数组console.log(obj1.c == obj2.c); // true,true就证明了数组是同一个对象</script> </body></html>
对象的深克隆
- 和数组的深克隆类似,对象的深克隆需要使用递归。
- 深克隆:克隆对象的全貌,不论对象的属性值是否又是引用类型值,都能将它们实现克隆。
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </head><body><script>var obj1 = {a: 1,b: 2,c: [33, 44, {m: 55,n: 66,p: [77, 88]}]};// 深克隆function deepClone(o) {// 要判断o是对象还是数组if (Array.isArray(o)) {// 数组var result = [];for (var i = 0; i < o.length; i++) {result.push(deepClone(o[i]));}} else if (typeof o == 'object') {// 对象var result = {};for (var k in o) {result[k] = deepClone(o[k]);}} else {// 基本类型值var result = o;}return result;}var obj2 = deepClone(obj1);console.log(obj2);console.log(obj1.c == obj2.c); // falseobj1.c.push(99);console.log(obj2.c); // obj2不变的,因为没有“藕断丝连”的现象obj1.c[2].p.push(999);console.log(obj2.c[2].p); // obj2不变的,因为没有“藕断丝连”的现象</script> </body></html>