终于有对象了

Author Avatar
Ninefire 6月 08, 2018
  • 在其它设备中阅读本文章

JS中的数据类型

  • String(字符串)
  • Number(数值)
  • Boolean(布尔值)
  • Null(空值)
  • Undefined(未定义)

以上5种类型属于基本数据类型,之后所见的值只要不是以上其中之一,都属于对象。

  • Object(对象)

基本数据类型都是单一的值,如"hello"123trueNull,值与值直接没有任何联系。

如果使用基本数据类型的数据,我们创建的变量都是独立的,不能成为一个整体。

但是,从现在起我们有对象了。

对象是一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。


对象的分类

  1. 内建对象
    • 由ECMAScript标准中定义的对象,在任何ECMAScript的实现中都可以使用。
      例如:MathStringNumberFunctionObject……
  1. 宿主对象
    • 有JavaScript的运行环境提供的对象,此处主要指由浏览器提供的对象。
      例如:BOM(浏览器对象模型)、DOM(文档对象模型)中定义的各种对象
  1. 自定义对象
    • 由开发人员创建的对象。

对象的基本操作

创建对象

  • 使用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 对象;

基本和引用数据类型

基本数据类型:StringNumberBooleanNullUndefined

引用数据类型: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