引用类型的值(对象)是引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。var person = new Object();
,这行代码创建了Object引用类型的一个实例,然后该实例保存在变量person中。
Object类型
很多引用数据类型值都是Object类型的实例。而且,Object也是ECMAScript中使用最多的一个类型。 也可以使用对象字面量表示,省略“new object()”。一般来说,访问对象属性时都是用点表示:person.name,或方括号表示person[“name”](推荐使用)。
Array类型
ECMAScript中的数组与其他多数语言中的数组有着相当大的区别,虽然数组数据的有序列表,但数组的每一项都可以用来表示任何类型的数据。
数组的初始化
创建数据的基本方法由两种,第一种用Array构造函数,第二用使用数组字面量法。1
2
3
4
5
6
7
8
9var colors = new Array(20); //lenght = 20
var colors = Array("red","blue","green"); //可以不要new
var colors = ["red","blue","green"]
var values = [1,2,];//不要这样!会创建一个包含2或3项的数组
var values = [1,"two"]; //可以类型不同
var colors.length = 2; //会导致colors的长度变为2,去掉第三个及后面的数值
检测数组及转换方法
1 | if (Array.isArray(value)) {//检查value是数组的话,执行操作} |
队列方法和栈方法
栈是先入后出策略,结合push()和pop()方法实现。队列是先入先出策略,结合push()和shift()方法实现。push()、pop()、shift()使用后,都会改变数组长度。1
2
3
4
5
6var count = colors.push("black","white");
var item = colors.pop(); //pop是突然抛出的意思。弹出最后一项"white"
var item1 = colors.shift(); //shift是移动的意思,取出第一项
var count = colors.unshift("yellow","o"); //在数组最前面添加两项
RegExp类型
ECMAScript通过RegExp类型支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式。1
var expressions = /pattern/ flags ; //
模式pattern可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。flags有三个标志g i m,分别表示全局模式、不区分大小写、多行模型。一次可以带多个标志。
Function类型
在ECMAScript中,函数都是Function类型的实例,与其它类型一样具有属性和方法,函数名实际上也是一个纸箱函数对象的指针,不会和某个函数绑定。函数名为指针,所以没有重载,后面的函数会指向之前定义的函数。另外,函数还可以作为值使用,它的值为返回值,所以可以作为另一个函数的输入参数。
函数声明与函数表达式
1 | alert(sum(10,10)); //20.代码执行前,解析器已经将函数声明添加到函数声明中。 |
函数内部属性
在函数内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,包含传入函数中的所有参数(函数可以传入任何数量的参数)。arguments月还有一个名叫callee的属性,它指向拥有这个arguments的函数。还有一个函数对象的属性:caller,保存着调用当前函数的函数的引用,如果实在全局作用域中调用当前函数,它的值是null。1
2
3
4
5
6
7function factorial(num){ // 使用递归算法求阶乘
if(num<=1){
return 1;
}else{
return nume*arguments.callee(num-1)
}
}
函数属性和方法
在ECMAScript中,函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:length和prototype。length属性表示函数希望接收的命名参数的个数。prototype是保存所有实例方法的真正所在,比如toString()等方法都在prototype名下,只不过通过各自对象的实例访问本罢了。并且prototype属性不可枚举。
基本包装类型
为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean、Number、String。每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象。1
2
3
4
5
6
7
8
9
10
11
12
13
14var falseObjext = new Boolean(false); //bool形式的false。但是用typeof返回时object
var falsevalue = false; //bool形式的false。使用typeo返boolean
var numberObject = new Number(10); // typeof返回object
var numberValue = 10; //typeof 返回number 两者的区别还在于对象的生存期。前者一直保存在内存中。后者不然
alert(numberValue.toString(16)); //“a”,转为16进制,再转换成字符串形式
var stringObject = new String("hello world"); //typeof :object。可以添加属性和方法。
var stringValue = "hello world"; //typeof: string 。这种方法不能为其添加属性方法,会被立即销毁
alert(stringValue.lenght); //"11"
var result = stringValue.concat("!!!"); //result:"hello world!!!"
var str = stringValue.subString(2); //llo world
var str = stringValue.slice(3,8); //lo wo
alert(stringValue.indexOf("o")); //4.第一个o的位置。lastIndexOf("o"),最后一个o的位置
单体内置对象
由ECMAScript实现提供的、不依赖于宿主环境的对象,在程序执行前已经存在。内置对象有Object、Array和String等。还有:Global和Math
Global对象
所有在全局作用域中定义的属性和函数,都是全局对象的属性。不属于任何其他对象的属性和方法都是Global对象的属性和方法。
- URI编码方法。encodURI()和encodeURIComponent()可以对URI进行编码,以便发给浏览器。前者主要用于整个URI,后者主要用于对URI的某一段进行编码。
- eval()方法:就像一个完整的ECMAScript解析器。只接受一个参数,即要执行那个的代码的字符串。
- window对象:Web浏览器将这个全局对象作为window对象的一部分加以实现。所以全局作用域中声明的所有变量和函数,都成为了window对象的属性。
Math对象
ECMAScript还未保存数学公式和信息提供了一个公共位置,即Math对象。
- Math.E: 自然数对数的底数,及常量E。还有Math.PI等特殊值常量
- min()/max():求输入的number中的最大值或最小值
- Math.round():四舍五入为最接近的整数。
- Math.random(): 返回大于等于0小于1的一个随机数