终于有对象了
JS中的数据类型
- String(字符串)
- Number(数值)
- Boolean(布尔值)
- Null(空值)
- Undefined(未定义)
以上5种类型属于基本数据类型,之后所见的值只要不是以上其中之一,都属于对象。
- Object(对象)
基本数据类型都是单一的值,如"hello"
、123
、true
、Null
,值与值直接没有任何联系。
如果使用基本数据类型的数据,我们创建的变量都是独立的,不能成为一个整体。
但是,从现在起我们有对象了。
对象是一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
对象的分类
- 内建对象
- 由ECMAScript标准中定义的对象,在任何ECMAScript的实现中都可以使用。
例如:Math
、String
、Number
、Function
、Object
……
- 由ECMAScript标准中定义的对象,在任何ECMAScript的实现中都可以使用。
- 宿主对象
- 有JavaScript的运行环境提供的对象,此处主要指由浏览器提供的对象。
例如:BOM(浏览器对象模型)、DOM(文档对象模型)中定义的各种对象
- 有JavaScript的运行环境提供的对象,此处主要指由浏览器提供的对象。
- 自定义对象
- 由开发人员创建的对象。
对象的基本操作
创建对象
- 使用
new
关键字调用的函数是构造函数(constructor)。
构造函数是专门用来创建对象的函数。
使用typeof
检查一个对象时,返回值是object
。
- 在对象中保存的值称为属性。
给对象添加属性:对象.属性名 = 属性值;
// 使用构造函数创建一个girlFriend对象
var girlFriend = new Object();
// 给对象添加一个name属性
grilFriend.name = "她的名字";
// 给对象添加一个gender属性
grilFriend.gender = "女";
// 给对象添加一个age属性
girlFriend.age = 21;
// 给对象添加一个description属性
girlFriend.description = "美丽,温柔,可爱,人畜无害";
读取对象中的属性
语法:对象.属性名;
如果读取对象中没有改属性,不会报错而会返回undefined
。
console.log(girlFriend.name);
document.write(girlFriend.description);
修改对象的属性值
语法:对象.属性名 = 新属性值;
girlFriend.age = 22;
girlFriend.description = "贤惠,勤奋,诚实,持家";
删除对象的属性
语法:delete 对象.属性名;
delete girlFriend.name;
delete girlFriend.description;
属性名和属性值
属性名:
- 对象的属性名不强制要求遵守标识符的命名规范,各种乱七八糟的名称都可以使用。
- 但是在开发过程中尽量按照标识符的规范去命名。
- 如果要使用特殊的属性名,不能采用
.
的方式来编写。- 需要使用另一种方式:
语法:对象["属性名"] = 属性值;
读取时也需采用这种方式。 - 使用
[ ]
这种形式去操作属性更加灵活,在中可以直接传递一个变量,此时会根据变量值读取对应的属性。
- 需要使用另一种方式:
属性值:
- 对象的属性值可以是任何数据类型的数据。
甚至也可以是一个对象。
- 通过
in
运算符可以检查一个对象中是否含有指定的属性
如果有则返回true
,没有则返回false
。
语法:"属性名" in 对象;
基本和引用数据类型
基本数据类型:String
、Number
、Boolean
、Null
、Undefined
引用数据类型:Object
- JS中的变量都是保存到栈内存中的
- 基本数据类型的值直接在栈内存中存储,变量中保存的就是值,且值与值之间是独立存在的,修改一个变量不会影响其他的变量,
- 引用数据类型的值(对象)是保存在堆内存中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间,而变量中保存的是对象的内存地址(对象的引用)。如果两个变量保存的是同一个对象引用(地址),那么通过其中一个变量修改属性值时,另一个也会受到影响。
- 如果两个变量保存的是同一个对象引用(地址),当修改一个对象为
null
时,另一个对象不会随之改变。
举个形象的例子,你应该听说过,巫师有一种巫毒娃娃,将讨厌之人的名字和生辰八字写在娃娃背后,然后用针扎娃娃的眼睛,讨厌之人的眼睛就会疼甚至瞎。那么此时,“巫毒娃娃”就相当于“变量”,“名字和生辰八字”就相当于变量中存储的“地址”(对象的引用)。变量中存放的并不是对象本身,而你却可以通过变量来操作对象的属性,就如同“巫毒娃娃”并不是讨厌之人,而你却可以通过“巫毒娃娃”折磨讨厌之人,只是因为变量中的地址指向对象,而巫毒娃娃上的文字指向讨厌之人。
此时,如果讨厌之人特别讨厌以至于另一个人也讨厌他,那么他也会制作一只相似的“巫毒娃娃”,上面写着相同的名字和生辰八字,若此人百般痛恨以至于将“巫毒娃娃”的腿卸掉一只,那么另一只巫毒娃娃也会没了腿。就如同创建了一个相似的“变量”,其中存储了相同的“地址”(引用),那么通过其中一个“变量”修改了“对象”,从另一个变量读取时也会读取到被修改的对象。只因为两只巫毒娃娃指向同一个人,而两个变量指向同一个对象。
又此时,其中一个巫毒娃娃的主人良心发现,决定不再通过娃娃折磨讨厌之人,于是将巫毒娃娃扔了,但是另一个人并不会随之扔掉,他可能还需要继续扎讨厌之人。就如同设置其中一个对象为null
,而另一个对象不会随之改变。
- 当比较两个基本数据类型的值时,就是比较它们的值,而比较两个引用数据类型的时,则是比较对象的内存地址,如果两个对象一模一样,但是地址不相同,它们也是不相等的。
对象的字面量
使用构造函数创建对象
var girlFriend = new Object();
girlFriend.name = "她的名字";
girlFriend.age = 21;
girlFriend.cups = "C";
girlFriend.hobby = "吃、睡、玩";
使用对象字面量来创建对象
var girlFriend = {};
- 使用对象字面量,可以在创建对象时,直接指定对象中的属性
语法:{属性名:属性值,属性名:属性值......}
对象字面量的属性名可以加引号也可不加,建议不加,如果需要使用一些特殊符号的名称,则必须加引号。
属性名和属性值是一组组的名值对结构,名和值之间使用冒号:
连接,多个名值对之间使用逗号,
隔开,最后一个名值对后面不加逗号。
var girlFriend = {
name:"她的名字",
age:21,
hobby:"吃、睡、玩",
figure:{bust:"C",waist:61.1,hip:89.1}
};
枚举对象中的属性
- 使用
for ... in
语句
对象中有多少个属性,循环体就会执行多少次,每次执行时,会将对象中的一个属性名赋值给变量。
语法:
for(var 变量 in 对象){
}
例:
// 创建一个对象
var girlFriend = new Object();
girlFriend.name = "她的名字";
girlFriend.age = 21;
girlFriend.cups = "C";
girlFriend.hobby = "吃、睡、玩";
// 枚举对象中的名值对
for(var n in girlFriend){
console.log(n + " = " + girlFriend[n]);
}
如发现错误请联系我,谢谢你。
本文链接:http://ninefire.tk/JavaScript.basics/09.html