五种基本数据类型都是单一的值,没有任何的联系,而剩下的对象是一种复合的数据类型,在对象中可以保存多个不同的数据类型的属性。
对象的分类:
1:内建对象:js标准中定义的对象,在任何的js实现中都可以使用。比如Math(),String(),Number().
2:宿主对象:js运行的环境,浏览器提供的对象。比如DOM,BOM.
3:自定义对象:有开发人员自己建立的对象。
创建对象:
使用new关键字调用的函数,是构造函数constructor。构造函数是专门用来创建对象的函数。在对象中保存的值称为属性。向对象添加属性。语法:对象.属性名=属性值。读取对象中的属性,语法:对象.属性名。修改对象的属性值,语法:对象.属性名=新值。删除对象的属性,语法:delete 对象.属性名.
属性名不强制要求标识符的规。如果采用特殊的属性名则语法:对象[""]=属性值。 读取时采用这种方式,去操作属性更加的灵活。在[]中可以直接传递一个变量,这样变量值是多少就可以读取那个属性。
js对象的属性值,可以是任意的数据类型,甚至也可以是一个对象。in运算符,可以检查一个对象中是否含有指定的属性。如果有则返回true,没有则返回false. 语法:"属性名" in 对象。
使用对象字面量创建一个对象。语法:var obj={};使用对象字面量创建对象,直接指定对象中的属性,语法:{属性名:属性值,属性名:属性值...}属性名和属性值是一对一对的名值对结构,明和值之间使用: 多个名值对之间使用,隔开
函数;
函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)。函数可以保存一些代码在需要的时候调用。
创建一个函数对象。可以将要封存的代码以字符串的形式传递给构造函数。封装到函数中的代码不会立即执行。函数中的代码会在调用的时候执行。调用函数语法:函数对象()。当调用函数时,函数中的代码会按照顺序执行。但是在实际开发中,不会使用这种方式。
使用函数声明创建一个函数:
语法:function 函数名([形参1,形参2,...形参n]){
语句...
}
使用函数表达式来创建一个函数
var 函数名=function([形参1,形参2,...形参n]){
语句...
};
可以在函数的括号里指定一个或多个形参(形式参数),多个形参之间使用逗号隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值。在调用函数时,可以在括号里指定实参,实参可以复制给对应的形参。调用函数时,解析器不会检查实参的类型,也不会检查实参的数量,多余实参不会被赋值,如果实参的数量小于形参的数量,则没有对应实参的形参是undefined.此外函数的实参可以是任意的数据类型。
可以使用return来设置函数的返回值 语法:return 值 return后的值将会作为函数的执行结果返回。可以定义一个变量来接受该结果。变量rsult的值就是函数的执行结果,函数返回什么result的值就是什么,在函数中return后的语句都不会执行。如果return后的值不跟任何值,就相当于返回一个undefined.
实参可以是任意的数据类型,也可以是一个对象。当参数过多时,可以封装到一个对象中,然后通过对象传递。
实参也可以是一个函数,
返回值可以是任意的数据类型,也可以是一个对象,也可以是一个函数。
对象的属性值可以是任意的数据类型,既可以是对象,也可以是一个函数。如果一个函数作为一个对象的属性保存,那么我们称这个函数为这个对象的方法,调用函数就是调用对象的方法(method)
枚举对象的属性:
语法:for(var 变量in 对象){} for...in....语句中有几个属性,循环体就会执行几次,每次执行时,会将对象中的一个属性的名字赋值给变量,要想取属性值,可以用[],方括号可以放变量。
作用域:
作用域指一个变量的作用的范围。js一共有2种作用域。1:全局作用域。直接编写在script标签中的JS代码,都在全局作用域中。全局作用域中有一个全局对象,window,可以直接使用。他代表的是一个浏览器的窗口,由浏览器创建,我们可以直接使用。在全局作用域中,创建的变量都会作为window的属性保存,创建的函数都会作为window对象的方法保存。使用var 关键字声明的对象,会在代码执行前被声明(但是不会被赋值)。函数的声明提前:使用函数声明形式创建的函数 function 函数名(){},他会在所有的代码执行之前就会被创建,所以可以在函数声明前调用函数。使用函数表达式创建的函数,不会被声明提前,所以不能再声明前调用。全局作用域的变量是全局变量,在页面任意的部分都可以访问的到。
但如果声明变量是不使用var 关键字,则变量不会被提前声明,
2:局部作用域(函数作用域)。在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到局部作用域的变量。在函数中要访问全局变量,可以使用window对象。在函数作用域中也有声明提前的特性。在函数中不适用var 声明的变量,都会成为全局变量。定义形参就相当于在函数作用域中声明了变量。
解析器在调用函数时,每次都会向函数内部调用一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this会指向不同的对象。以函数的形式调用时,this永远都是window,以方法的形式调用时,this就是调用方法的那个对象。
使用工厂方法创建对象:
通过该方法可以大批量的创建对象。使用工厂方法创建的对象,使用的构造函数都是object,所以创建的对象都是Object这个类型,就导致无法区分出不同类型的对象。
function createPerson(){}
创建一个构造函数:
专门用来创建person对象,构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数首字母大写。
构造函数和普通函数的不同,就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字调用。
构造函数的执行流程:1:立即创建一个新的对象 2:将新建的对象设置为函数中的this,在构造函数中,可以使用this来调用新建的对象。3:逐步执行函数中的代码 4:将新建的对象作为函数值返回。使用同一个构造函数构造的对象,我们称为一类对象,也将一个构造函数称为一个类,我们将一个构造函数创建的对象,称为该类的实例。
使用 instanceof 可以检查一个对象是否是一个类的实例。语法:对象 instanceof 构造函数。
我们所创建的每一个函数,浏览器都会像函数中添加一个属性prototype。如果函数作为普通函数调用,prototype没有任何作用,当函数通过构造函数调用时,他所创建的对象都有一个隐含的属性,指向该构造函数的原型对象,我们可以通过-proto-来访问该属性。原型对象相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象。我们可以将对象中共有的内容,统一设置到原型对象中。当我们访问一个对象的属性或方法时,他会先在对象自身中寻找。如果有则直接使用,如果没有则向原型对象中寻找,如果找到则直接使用。以后创建构造函数时,可以将这些对象共有的属性和方法,同意添加到构造函数的原型对象中。这样不用向每一个对象添加,也不会影响到全局作用域,就可以使每一个对象具有这些属性和方法。可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性。
当我们直接在页面中打印一个对象时,实际上输出的对象时 toString()方法的返回值。如果我们希望输出对象时不输出[object object],可以为对象添加一个toString()方法。