6.1 对象的定义
对象在JS中就是一个数据容器,也叫作数据结构。
它的作用与数组一致,都是用来装载数据。
数组的结构: 下标 => 成员对象的结构: 名(键) => 值名:就是字符串值:任意数据类型
一组键:值,就是一条属性。属性之间没有顺序要求。
总结:对象是属性的无序集合, 顺便一提:当属性的值是函数时,我们管它叫做对象的方法。
6.1.1 字面量
var obj = {key: value,key1: value1,...};

6.1.2 构造函数
var obj = new Object();
6.2 对象属性操作
6.2.1 添加属性
点语法添加属性: 点语法:点什么就是什么
var zhangsan = {}zhangsan.height = '180cm'console.log(zhangsan); // {height: "180cm"}
方括号语法添加属性:
var zhangsan = {}zhangsan['weight'] = '60kg';var i = 'age'zhangsan[i + 1] = 19;console.log(zhangsan); // {weight: '60kg', age1: 19}
6.2.2 删除属性
delete 这是一个关键字 用于删除对象的属性
delete obj.name;
6.2.3 读取属性
- 方括号语法 最终方括号内必须是字符串 ```javascript // 定义一个对象 var obj = { “name”: “张三”, “girl————————-Friend”: { “name”: “小红” } }
console.log(obj[‘name’])// 张三 console.log(obj[‘girl————————-Friend’]) // {name: ‘小红’}
> 方括号语法内要的是一个字符串2. 点语法 点什么就是什么
// 定义一个对象 var obj = { “name”: “张三”, “girl————————-Friend”: { “name”: “小红” } } console.log(obj.name) // 张三 // 点语法无法读取不遵守变量命名规范的属性名
<a name="2725c887"></a>## 6.3 for...in```javascriptfor (var i in zhangsan) {// i 是循环变量}
这个是一个新语法 这个循环专门用于循环对象 循环次数:根据对象的属性条数决定 i 表示循环变量 它在每一次循环中表示的是对应的属性名 想要访问属性值 必须使用方括号语法
6.3.1 循环对象
// 定义一个对象var zhangsan = {name: "张三",age: 20,sex: "男",height: 180,weight: 140,girlFriend: null}for (var i in zhangsan) {console.log(i, zhangsan[i])}
6.3.2 循环数组
var arr = [1, 2, 3, 4, 5];for (var i = 0; i < arr.length; i++) {console.log(i, arr[i])}

6.4 深浅复制(深浅拷贝)
6.4.1 浅复制
假设有对象如下,现有需求,复制一份数据。
var obj = {name: "小李",age: 22,sex:"女",boyFriend: {name: "老李",age: 33,sex: "男"}}
于是我们写代码如下:
var obj1 = {}for (var i in obj) {obj1[i] = obj[i]}
结果如图:
这就是浅复制,仅仅只是复制了值类型属性,引用类型属性没有真的复制。
如果此时修改obj.name 不会影响到obj1.name
obj.name = "小王";console.log(obj1.name)

但是如果修改obj.boyFriend.name 将会影响到obj1.boyFriend
obj.boyFriend.name = '老王';console.log(obj1.boyFriend.name)
6.4.2 深复制
示意图
function deepCopy(target) {var obj1 = {}for (var i in target) {// 判定这条属性是值类型的值还是引用类型的值if (typeof target[i] === 'object' && target[i] != null) {obj1[i] = deepCopy(target[i]);} else {// 值类型obj1[i] = target[i];}}return obj1;}
过程图
