(注:JavaScript高级程序设计(第3版)学习笔记)
在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
对象是某个特定引用类型的实例。
新对象是使用new操作符后跟一个构造函数来创建的。
构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义的。
var people=new Object()
该实例保存在了变量people中。使用的构造函数是Object,它只为新对象定义了默认的属性和方法。
Object 类型
Object 的实例对于在应用程序中存储和传输数据而言,是非常理想的选择。
创建Object实例的方式有两种。第一种:new 操作符后跟Object构造函数:
var people=new object();
people.name="llm";
people.sex="女";
people.ag=27;
另一种方式是使用对象字面量
表示方法。
对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程
。
//与上面相同的定义:
var people={
name:"llm",
sex:"女",
age:27
}
左边花括号({)表示对象字面量的开始。如果跟在if语句条件的后面,则表示一个语句块的开始。定义了name属性,之后是一个冒号,再后面是这个属性的值。在对象字面量中,使用逗号来分隔不同的属性。
使用对象字面量语法时,如果留空其花括号,可以定义只包含默认属性和方法的对象,如下所示:
var people={};
people.name="llm";
people.sex="女";
people.age=27;
一般来说,访问对象属性时使用点表示法,这是很多面向对象语言中通用的语法。不过,在JavaScript也可以使用方括号表示法来访问对象的属性。在使用方括号语法时,应该将要访问的属性以字符串的形式放在方括号中。如下示例:
alert(people["name"]); //llm
alert(people.name);//llm
方括号语法的主要优点是可以通过变量来访问属性。
如下:
var propertyName="name";
alert(people[propertyName])
属性名中是可以包含非字母非数字的,这时候就可以使用方括号表示法来访问它们。建议使用点表示法。
Array类型
除了Object之外,Array类型是最常用的类型。ECMAScript中的数组与其他语言多数语言中的数组有相当大的区别。虽然ECMScript数组与其他语言中的数组都是有序列表,但与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据。而且ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
创建数组的基本方式有两种。第一种是使用Array构造函数,如下面代码所示:
var colors= new Array();
如果预先知道数组要保存的项目数量,也可以给构造函数传递该数量,而数量会自动变成length属性的值。如下:
var colors=new Array(20);
也可以向Array构造函数传递数组中应该包含的项。以下代码创建了一个包含3个字符串值的数组:
var colors= new Array("black","yellow","blue");
如果传递的是数值,则会按照该数值创建包含给定项数的数组;而如果传递的是其他类型的参数,则会创建包含那个值的只有一项的数组
。如下:
var colors=new Array(3); //创建一个包含3项的数组
var colors=new Array("red"); //创建一个包含1项,即一个字符串"red" 的数组
另外,使用Array构造函数时也可以省略new操作符。
如下:
var colors=Array(3); //创建一个包含3项的数组
var colors=Array("red"); //创建一个包含1项,即字符串"red"的数组
数组创建的字面量表示法,由一对包含数组项的方括号表示,多个数组项之间以逗号隔开,如下:
var colors=["red","black","orange"]; //创建一个包含3个字符串的数组
var names=[];
//创建一个空数组
var values=[34,45,];
//不要这样!这样会创建一个包含2或3项的数组
var options=[,,,];
//不要这样!这样会创建一个包含3或4项的数组
在读取和设置数组的值时,要使用方括号并提供相应值的基于0的数字索引,如下:
var colors=["红色","粉色","蓝色"]; //定义一个字符串数组
alert(colors[0]); //显示第一项
colors[2]="黑色"; //修改第三项
colors[3]="橘色"; //新增第四项
数组的项数保存在其length属性中,这个属性始终会返回0或更大的值,如下:
var people=["黎明","王芳","小花"]; //创建一个包含3个字符串的数组
var na=[]; //创建一个空数组
alert(people.length); //3
alert(na.length); //0
数组的length属性很有特点——它不是只读的。通过这个属性,可以从数组的末尾移除项或向数组中添加新项。
如下:
var people=["黎明","王芳","小花"]; //创建一个包含3个字符串的数组
people.length=2
alert(people[2]); //undefined
利用length属性也可以方便地在数组末尾添加新项。
如下:
var people=["黎明","王芳","小花"]; //创建一个包含3个字符串的数组
people[people.length]="小米" //在位置(3)添加一个人名
people[people.length]="小明" //在位置(4)在添加一个人名
由于数组最后一项的索引始终是length-1,因此下一个新项的位置就是length。每当在数组末尾添加一项后,其length属性就会自动更新以反应这一变化。当把一个值放在超出当前数组大小的位置上时,数组就会重新计算其长度值,即长度值等于最后一项的索引加1,如下:
var people=["黎明","王芳","小花"]; //创建一个包含3个字符串的数组
people[99]="小米"; //在位置(99)添加一个人名
alert(people.length); //100
注:位置3到位置98实际上都是不存在的,所以访问它们都将返回undefined。
检测数组
对于一个网页或一个全局作用域而言,使用instanceof
操作符就能得到满意的结果:
if(value instanceof Array){
//对数组执行某些操作
}
instanceof操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。
ECMAScript 5新增了Array.isArray()方法。这个方法的目的是最终 确定某个值到底是不是数组,不管它是在哪个全局执行环境中创建的。使用如下:
if(Array.isArray(value)){
//对数组执行某些操作
}
转换方法
所有对象都具有toLocaleString()、toString()和valueOf()方法。其中,调用数组的toString()方法会返回由数组中的每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用valueOf()返回的还是数组。实际上,为了创建这个字符串会调用数组每一项的toString()方法。如下:
var people=["小米","小明","小红"];
alert(colors.toString());
alert(people.valueOf());
网友评论