一. 引用数据类型中的对象
1.1 概述
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
var obj = {
name:"zevin",
"age":21,
7:{
lost:shanxi,city:yuncheng},
get:funciton(a){
return true;
}
};
上述代码中,大括号就定义了一个对象(对象是以{ }
作为边界),它被赋值给变量obj
,所以变量obj
中保存的引用地址就指向了一个对象。该对象中包含了四个键值对:
-
name,“age”,7,get被称为键名:
js规定对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。数字也可以是键名,会被自动转换成字符串。 -
“zevin”,21,{lost:shanxi,city:yuncheng},匿名函数被称为键值:
键值几乎可以是任何类型:字符串,数字,对象,匿名函数等等。
键与值通过“:”隔开,键值对之间通过“,”隔开,最后一个键值对(get)后面的逗号可有可无。
1.2 初始化
1.2.1 字面量
var obj = {
};
1.2.2 构造函数模式
使用Object系统内置的对象构造函数,也可以使用自定义构造函数。obj是对象,也被称为实例。Object是类,也被称为构造函数,构造函数是创建对象的模板。
var obj = new Object();
1.3 属性访问
var obj = {
name:"zevin",
1107:21,
gender:"male"
};
1.3.1 点访问
(对象 . 属性名)。数字键名不能使用点访问,必须采用中括号访问。
obj.name // "zevin"
obj.1107 // 报错
1.3.2 中括号访问
如果中括号里直接放键名,那么键名必须放在引号里面,否则会被当作变量处理。当然也可以用变量代理。
数字键名只能使用中括号访问,而且可以不加引号。
obj["name"] // "zevin"
var man = "gender";
obj[man] // male 等价于: obj["gender"] 等价于: obj.gender
obj[1107] // 21
1.4 属性的赋值
点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。
var obj = {
};
obj.name = "zevin";
obj[1107] = 21;
JS允许随时新增属性,不一定要在定义对象的时候,就定义好属性。(在java对象中,定义对象时就确定了属性不可更改)。
这是正常的默认赋值,后续还可以通过Object.defineProperty()方法添加自定义属性的方式来满足我们更复杂的需求(比如属性不可写)。传送门👇:
【JavaScript笔记(五)】为对象添加自定义属性 —— Object.defineProperty()方法详细解读
1.5 属性的查看
1.5.1 Object.keys
查看一个对象本身的所有属性,可以使用Object.keys
方法。会返回一个数组包含该对象所有可遍历的属性键名。
var obj = {
name:"zevin",
1107:21,
gender:"male"
};
Object.keys(obj); // ['name','1107','gender']
1.5.2 in 运算符
in 运算符用来检查对象是否包含某个属性,无论是自身定义的,还是继承的,只要包含都会返回true;否则返回false。
var obj = {
name:"zevin",
1107:21,
gender:"male"
};
"name" in obj; // true
"age" in obj; // false
"toString" in obj; // true
1.6 属性的遍历(for-in)
依次从obj
中获取属性名赋值给key
,通过obj[key]
访问属性值。
for(var key in obj){
console.log(key,obj[key]);
};
for-in循环还有两点需要注意:
- for-in循环只会遍历输出可遍历(
enumerable = true
)的属性; - 它不仅遍历对象自身的属性,还遍历继承的属性。
举