一、对象的简介
1、JS中的数据类型
—— String 字符串
—— Number 数值
—— Boolean 布尔值
—— Null 空值
—— Undefined 未定义
——以上五种类型属于基本数据类型,以后我们看到的值只要不是上面这五种,则为对象
—— Object 对象
2、基本数据类型都是单一的值,如:“hello”、123、true ··· ··· 值和值之间没有任何的联系
3、对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
4、对象的分类:
(1)内建对象
—— 由ES变准中定义的对象,在任何的ES的实现中都可以使用
比如:Math String Number Boolean Function Object ···· ····
(2)宿主对象
—— 由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
比如:BOM DOM
(3)自定义对象
—— 由开发人员自己创建的对象
5、创建对象
(1)使用 new 关键字调用的函数,是构造函数 constructor
(2)构造函数是专门用来创建对象的函数
(3)使用 typeof 检查一个对象时,会返回 object
6、读取对象中的属性
语法: 对象 . 属性名
如果读取对象中没有的属性,不会报错而是会返回 Undefined
7、修改对象的属性值
语法: 对象 . 属性名 = 新值
8、删除对象中的属性
语法: delete 对象 . 属性名
二、属性值和属性名
1、属性名
① 对象的属性名不强制要求遵守标识符的规范,什么乱七八糟的名字都可以使用,但是我们使用还是按照标识符的规范去做
② 如果需要使用特殊的属性名,不能采用 . 的方式来操作,需要使用另一种方式:
语法: 对象[ “属性名” ] = 属性值
读取时也要采用这种方式
使用 [ ] 这种形式去操作属性,更加灵活,在 [ ] 中可以直接传递一个变量,这样变量值是多少就会读取那个属性
2、属性值
① JS 对象的属性值,可以是任意的数据类型,甚至可以是一个对象。
② in 运算符
—— 通过该运算符可以检查一个对象中是否含有指定的属性,如果有则返回 true ,没有则返回 false
—— 语法: “属性名” in 对象
三、基本数据类型和引用数据类型
1、基本数据类型:String Number Boolean Null Undefined
2、引用数据类型:Object
3、JS中的变量都是保存到栈内存中的
—— 基本数据类型的值直接在栈内存中存储,值与值之间是独立存在的,修改一个变量不会影响其他变量。
—— 对象时保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响。
4、当比较两个基本数据类型的值时, 就是比较值;而比较两个引用数据类型时,就是比较对象的内存地址,如果两个对象时一模一样的,但是地址不同,他也会返回 false 。
四、对象字面量
1、使用对象字面量来创建一个对象
2、使用对象字面量,可以再创建对象时,直接指定对象中的属性
语法: { 属性名:属性值,属性名:属性值··· ··· }
3、对象字面量的属性名可以加引号也可以不加,建议不加,吐过要使用一些特殊的名字,则必须加引号。
4、属性名和属性值是一组一组的名值对结构,名和值之间使用 : 连接,多个名值之间使用 , 隔开。吐过一个属性之后没有其他属性了,就不要写,
五、函数 function
1、函数也是一个对象。
2、函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)。
3、函数中可以保存一些代码在需要的时候调用。
4、函数中 typeof 检查一个函数对象时,会返回 function
5、可以将要封装的代码以字符串的形式传递给构造函数
6、封装到函数中的代码不会立即执行,函数中的代码会在函数调用时执行
7、调用函数 语法 :
函数对象();
8、当调用函数时,函数中封装的代码会按照顺序执行
9、我们在执行开发中很少使用构造函数来创建一个函数对象。
10、使用 函数声明 来创建一个函数
语法:
function 函数名(形参1,形参2,·······){
语句······
}
形参可有可无
11、使用 函数表达式 来创建一个函数
语法:
var 函数名 = function (形参1,形参2,形参3,······){
语句······
}
形参可有可无
六、函数的参数
1、可以在函数的()中来指定一个或多个形参(形式参数),多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值。
2、在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参。
3、调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接受到非法的参数,如果有可能则需要对参数进行类型的检查。函数的实参可以是任意的数据类型。
4、调用函数时,解析器也不会检查实参的数量,多余的实参不会被赋值。如果实参的数量少于形参的数量,则没有对应实参的形参是undefined。
七、函数的返回值
1、可以使用 return 来设置函数的返回值
语法:
return 值;
2、 return 后的值将会作为函数的执行结果返回。可以定义一个变量来接收该结果。
3、变量 return 的值就是函数的执行结果,函数返回什么 return 的值就是什么。
4、 在函数中 return 后的语句都不会执行。
5、如果 return 语句后不跟任何值就相当于返回一个 undefined,如果函数中不写 return,则也会返回 undefined。
6、 return 后可以跟任意类型的值。
八、实参可以是任意值
1、实参可以是一个对象,也可以是一个函数。
九、返回值的类型
1、使用 return 可以结束整个函数。
2、返回值可以是任意的数据类型。也可以是一个对象,可以是一个函数。
十、立即执行函数
1、函数定义完,立即被调用,这种函数叫做立即执行函数。
2、立即执行函数往往只会执行一次。
十一、对象的补充——方法
1、对象的属性值可以是任何的数据类型,也可以是函数。
2、函数也可以称为对象的属性,如果一个函数作为一个对象的属性保存,那么我么称这个函数是这个对象的方法(method)。但是他只是名称上的区别,没有其他区别。
十二、枚举对象中的属性
使用 for ··· in 语句
语法:
for(var 变量 in 对象){
}
- for ··· in 语句 对象中有几个属性,循环体就会执行几次,每次执行时,会将对象中的一个属性名字赋值给变量。
十三、全局作用域(Scope)
1、作用域指一个变量的作用范围。
2、在JS中一共有两种作用域:全局作用域 和 函数作用域。
3、全局作用域
(1)直接编写在 script 标签中的JS代码,都在全局作用域
(2)全局作用域在页面打开时创建,在页面关闭时销毁
(3)在全局作用域中有一个全局对象 window ,它代表的是一个浏览器的窗口,有浏览器创建,我们可以直接使用。
(4)在全局作用域中:
创建的变量都会作为 window 对象的属性保存
创建的函数都会作为 window 对象的方法保存
(5)变量的声明提前
① 使用 var 关键字声明的变量,会在所有代码执行之前被声明(但是不会被赋值)
② 如果声明变量时不是用 var 关键字,则变量不会被声明提前
(6)函数的声明提前
—— 使用函数声明形式创建的函数 function 函数名(){ } ,他会在所有代码执行之前被创建,所以我们可以在函数声明前来调用函数。
—— 使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用。
(7)全局作用域中的变量都是全局变量,在页面的任意部分都可以访问到。
4、函数作用域
(1)调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁
(2)每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
(3)在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
(4)当在函数作用域操作一个变量时,他会先在自身作用域中寻找,如果有就直接使用,如果没有则向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中依然没有找到,则会报错
(5)在函数中要访问全局变量可以使用 window 对象
(6)在函数作用域中也有声明提前的特性,使用 var 关键字声明的变量,会在函数中所有代码执行之前被声明。函数声明也会在函数中所有的代码执行之前执行
(7)在函数中,不使用 var 声明的变量都会称为全局变量
(8)定义形参就相当于在函数作用域中声明了变量
5、 this
(1)解析器在调用函数每次都会向函数内部传递一个隐含的参数 —— this
(2)this 指向的是一个对象,这个对象我们称为函数执行的 上下文对象
① 以函数的形式调用时,this 永远都是 window
② 以方法的形式调用时,this 就是调用方法的那个对象
6、使用工厂方式创建对象
通过该方法可以大批量的创建对象
7、构造函数
(1)使用工厂方法创建的对象,使用的构造函数都是Object,所以创建的对象都是 Object 这个类型,就导致我们无法区分出多种不同类型的对象。
(2)构造函数就是一个普通的函数,创建方法和普通函数没有区别,不同的是构造函数习惯上首字母大写。
(3)构造函数和普通函数的区别就是调用方式不同,普通函数是直接调用,构造函数需要使用 new 关键字来调用。
(4)构造函数执行的流程:
① 立刻创建一个新的对象
② 将新建的对象设置为函数中的 this ,在构造函数中可以使用 this 来引用新建的对象
③ 逐行执行函数中的代码
④ 将新建的对象作为返回值返回
(5)使用 instanceof 可以检查一个对象是否是一个类的实例
语法:
对象 instanceof 构造函数
如果是,则返回 true ,否则返回 false
(6)使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。我们将通过一个构造函数创建的对象,称为是该类的实例。
(7)所有的对象都是 Object 的后代,所以任何对象和 Object 做 instanceof 检查时都会返回 true
(8) this 的情况:
① 当以函数的形式调用时,this 是 window
② 当以方法的形式调用时,谁调用方法 this 就是谁
③ 当以构造函数的形式调用时,this 就是新创建的那个对象
8、原型对象
(1)将函数定义在全局作用域,污染了全局作用域的命名空间,而且定义在全局作用域中也很不安全。
(2)原型 prototype
我们所创建的每一个函数,解析器都会向函数中添加一个属性 prototype ,这个属性对应着一个对象,这个对象就是我们所谓的原型对象。
(3)如果函数作为普通函数调用 prototype 没有任何作用。当函数以构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过 __proto__来访问该属性。
(4)原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。
(5)当我们访问对象的一个属性或方法时,他会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,找到则直接使用。
(6)以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。
(7)使用 in 检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回 true 。
(8)可以使用对象的 hasOwnProperty()来检查度夏宁自身中是否含有该属性。使用该方法只有当对象自身中含有属性时才会返回 true 。
(9)原型对象也是对象,所以他也有原型,当我们使用一个对象的属性或方法时,会先在自身中寻找,自身中如果有则直接使用,如果没有则去原型对象中寻找,如果原型对象中有,则使用,如果没有则去原型的原型中寻找,直到找到 Object 对象的原型,Object 对象的原型没有原型,如果在 Object 中依然没有找到,则会返回 undefined 。
9、toString()
① 当我们直接在页面中打印一个对象时,实际上是输出对象的 toString()方法的返回值
② 如果我们希望在输出对象时不输出 [ object object ] ,可以为对象添加一个 toString()方法
10、垃圾回收(GC)
① 程序运行过程中也会产生垃圾,这些垃圾积攒过多,会导致程序运行速度过慢,所以我们需要一个垃圾回收的机制,来处理程序运行过程中产生的垃圾。
② 当一个对象没有任何的变量或属性对他进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理。
③ 在 JS 中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作,我们需要做的就是将不再使用的对象设置为 null 即可。
本文分享到此结束,下一节继续分享JavaScript初级的数组。