引用类型

引用类型的值(对象)是引用类型的一个实例。在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
9
var 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
2
3
4
5
6
7
if (Array.isArray(value)) {//检查value是数组的话,执行操作}

alert(colors); //red,blue,green
alert(colors.toString()); //red,blue,green
alert(colors.valueOf()); //red,blue,green

alert(colors.join("||")); //red||blue||green

队列方法和栈方法

栈是先入后出策略,结合push()和pop()方法实现。队列是先入先出策略,结合push()和shift()方法实现。push()、pop()、shift()使用后,都会改变数组长度。

1
2
3
4
5
6
var 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
2
3
4
5
6
7
8
9
alert(sum(10,10)); //20.代码执行前,解析器已经将函数声明添加到函数声明中。
function sum(num1,num2){
return num1 + num2;
}

alert(sum1(10,10)); //错误!在执行前,变量sum中不会保存对函数的引用。因为函数在初始化语句中。
function sum1(num1,num2){
return num1 + num2;
}

函数内部属性

在函数内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,包含传入函数中的所有参数(函数可以传入任何数量的参数)。arguments月还有一个名叫callee的属性,它指向拥有这个arguments的函数。还有一个函数对象的属性:caller,保存着调用当前函数的函数的引用,如果实在全局作用域中调用当前函数,它的值是null。

1
2
3
4
5
6
7
function 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
14
var 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的一个随机数