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
```javascript
for (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;
}
过程图