6.1 对象的定义

对象在JS中就是一个数据容器,也叫作数据结构。

它的作用与数组一致,都是用来装载数据。

  1. 数组的结构: 下标 => 成员
  2. 对象的结构: 名(键) =>
  3. 名:就是字符串
  4. 值:任意数据类型

一组键:值,就是一条属性。属性之间没有顺序要求。

总结:对象是属性的无序集合, 顺便一提:当属性的值是函数时,我们管它叫做对象的方法。

6.1.1 字面量

  1. var obj = {
  2. key value,
  3. key1: value1,
  4. ...
  5. };

image.png

6.1.2 构造函数

  1. var obj = new Object();

6.2 对象属性操作

6.2.1 添加属性

点语法添加属性: 点语法:点什么就是什么

  1. var zhangsan = {}
  2. zhangsan.height = '180cm'
  3. console.log(zhangsan); // {height: "180cm"}

方括号语法添加属性:

  1. var zhangsan = {}
  2. zhangsan['weight'] = '60kg';
  3. var i = 'age'
  4. zhangsan[i + 1] = 19;
  5. console.log(zhangsan); // {weight: '60kg', age1: 19}

6.2.2 删除属性

delete 这是一个关键字 用于删除对象的属性

  1. delete obj.name;

6.2.3 读取属性

  1. 方括号语法 最终方括号内必须是字符串 ```javascript // 定义一个对象 var obj = { “name”: “张三”, “girl————————-Friend”: { “name”: “小红” } }

console.log(obj[‘name’])// 张三 console.log(obj[‘girl————————-Friend’]) // {name: ‘小红’}

  1. > 方括号语法内要的是一个字符串
  2. 2. 点语法 点什么就是什么

// 定义一个对象 var obj = { “name”: “张三”, “girl————————-Friend”: { “name”: “小红” } } console.log(obj.name) // 张三 // 点语法无法读取不遵守变量命名规范的属性名

  1. <a name="2725c887"></a>
  2. ## 6.3 for...in
  3. ```javascript
  4. for (var i in zhangsan) {
  5. // i 是循环变量
  6. }

这个是一个新语法 这个循环专门用于循环对象 循环次数:根据对象的属性条数决定 i 表示循环变量 它在每一次循环中表示的是对应的属性名 想要访问属性值 必须使用方括号语法

6.3.1 循环对象

  1. // 定义一个对象
  2. var zhangsan = {
  3. name: "张三",
  4. age: 20,
  5. sex: "男",
  6. height: 180,
  7. weight: 140,
  8. girlFriend: null
  9. }
  10. for (var i in zhangsan) {
  11. console.log(i, zhangsan[i])
  12. }

image.png

6.3.2 循环数组

  1. var arr = [1, 2, 3, 4, 5];
  2. for (var i = 0; i < arr.length; i++) {
  3. console.log(i, arr[i])
  4. }

image.png

6.4 深浅复制(深浅拷贝)

6.4.1 浅复制

假设有对象如下,现有需求,复制一份数据。

  1. var obj = {
  2. name: "小李",
  3. age: 22,
  4. sex:"女",
  5. boyFriend: {
  6. name: "老李",
  7. age: 33,
  8. sex: "男"
  9. }
  10. }

于是我们写代码如下:

  1. var obj1 = {}
  2. for (var i in obj) {
  3. obj1[i] = obj[i]
  4. }

结果如图:
image.png
这就是浅复制,仅仅只是复制了值类型属性,引用类型属性没有真的复制。
如果此时修改obj.name 不会影响到obj1.name

  1. obj.name = "小王";
  2. console.log(obj1.name)

image.png
但是如果修改obj.boyFriend.name 将会影响到obj1.boyFriend

  1. obj.boyFriend.name = '老王';
  2. console.log(obj1.boyFriend.name)

image.png

6.4.2 深复制

示意图
image.png

  1. function deepCopy(target) {
  2. var obj1 = {}
  3. for (var i in target) {
  4. // 判定这条属性是值类型的值还是引用类型的值
  5. if (typeof target[i] === 'object' && target[i] != null) {
  6. obj1[i] = deepCopy(target[i]);
  7. } else {
  8. // 值类型
  9. obj1[i] = target[i];
  10. }
  11. }
  12. return obj1;
  13. }

过程图
image.png