js引用类型(Object、Array)

时间:2023-02-06 21:15:27

引用类型

引用类型的值(对象)是引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织到一起。引用类型有时候也被称为对象定义,因为他们描述的是一类对象所具有的属性和方法。
如前所示,对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的。构造函数本身就是一个函数,只不过该函数是用于创建新对象的目的而定义的。

var person = new Object();

这行代码创建了Object引用类型的一个新实例,然后把该实例保存在了变量person中。使用的构造函数是Object,它只为新对象定义了默认的属性和方法。

Object类型

Object是ECMAScript中使用最多的一个类型
创建Object实例的方式有两种。

  • 第一种是使用new操作符后跟Object构造函数,如下所示:
var person = new Object();
person.name = "Nicholas";
person.age = 29;
  • 第二种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。下面这个例子就使用了对象字面量语法定义了与前面那个例子中相同的person对象:
>var person = {
>name : "Nicholas",
> age : 29
>}

在使用对象字面量语法的时候,属性名也可以使用字符串,如下面这个例子所示:

>var person = {
>"name" : "Nicholas",
>"age" : 29,
>5 : true
>}

这个例子会创建一个对象,包含三个属性:name、age和5。但这里的数值属性名会自动转换为字符串。

Array类型

除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了
创建数组的基本方式有两种。

  • 第一种是使用Array构造函数,如下面的代码所示。

var colors = new Array();

如果预先知道数组要保存的项目数量,也可以给构造函数传递该数量,而该数量会自动变成length属性的值。例如:

var colors = new Array(20);

也可以向Array构造函数传递数组中应该包含的项。例如:

var colors = new Array("red","blue","green");

另外,在使用Array构造函数时也可以省略new操作符,结果是相同的。

  • 创建数组的第二种基本方式是使用数组字面量表示法。数组字面量由一对包含数组项的方括号表示,多个数组项之间以逗号隔开。如下所示:

var colors = ["red","blue","green"];//创建一个包含3个字符串的数组

var name = [];//创建一个空数组

var values = [1,2,];//不要这样,会创建一个包含2或者3项的数组

var options = [,,,,,];//不要这样,会创建一个包含5或者5项的数组

1.检测数组

对于一个网页,或者一个全局作用域而言,使用instanceof操作符就能得到满意的结果(instanceof用来在运行时指出对象是否是特定类的一个实例,通过返回布尔值来判断):

>if(value instanceof Array){
>//对数组执行某些操作
>}

为了解决不同全局作用域的问题,新增了Array.isArray()方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。这个方法的用法如下:

>if(Array.isArray(value))
>//对数组执行某些操作
>}

2.转换方法

@[tolocalString(),toString(),valueOf()]

  • 调用数组的toString()方法会返回数组中的每个值的字符串形式拼接而成的一个以逗号分隔开的字符串。
  • 调用valueOf()返回的还是数组。
  • 为了创建字符串会调用数组的每一项的toString()方法。
    例子如下:

var colors = ["red","blue","green"];// 创建一个包含3个字符串的数组

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

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

alert(colors);// red,blue,green

在这里,我们首先显示调用了toString()方法,以便返回数组的字符串表示,每个值的字符串表示拼接成了一个字符串,中间以逗号隔开。接着调用valueOf()方法,而最后一行代码直接将数组传递给了alert()。由于alert()要收集字符串参数,所以它会在后台调用toString()方法,由此会得到与直接调用toString()方法相同的结果。

var person1 = 
toLocaleString : function(){
return "Nikolaos";
},
toString : function(){
return "Nicholas";
}
};
var person2 = {
toLocaleString :function(){
return "Grigorios";
},
toString : function(){
return "Greg";
}
};
var people = [person1,person2];
alert(people);//Nicholas,Greg
alert(people.toString());//Nicholas,Greg
alert(people.toLocaleString());//Nikolaos,Grigorios

3.栈方法

具体来说,数组可以表现的像栈一样,后者是一种可以限制插入和删除项的数据结构。栈是一种先进后出的数据结构,也就是最新添加的项最早被移除。

而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置——栈的顶部。有push()和pop()两种方法。

  • push()方法可以接收任意数量的参数,把他们逐个加到数组末尾,并返回修改后数组的长度
  • pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
var colors = new Array()//创建一个数组

var count = colors.push("red","green");//推入两项
alert(count);//2

count = colors.push("black");//推入一项
alert(count);//3

var item = colors.pop();//取得最后一项
alert(item);//"black"
alert(colors.length);//2

4.队列方法

栈数据结构的访问规则是LIFO(后进先出),而队列数据结构的访问规则是FIFO(先进先出)。队列在列表的末尾添加项,从列表的前端移除项。

  • shift()将数组长度减一,能够移除数组的第一项并返回该项。
  • unshift()用途刚好相反,它能在数组的前端添加任意个项并返回数组的长度。
var colors = new Array();//创建一个数组
var count = colors.push("red","green");//推入两项
alert(count);//2

count = colors.push("black");//推入另一项
alert(count);//3

var item = colors.shift();//取得第一项
alert(item);//"red"
alert(colors.length);//2

5.重排序方法

数组中已经存在两个可以直接用来重排序的方法:reverse()和sort()。

reverse()方法会反转数组项的顺序。

var values = [1,2,3,4,5];
values.reverse();
alert(values);//5,4,3,2,1这种方法不够灵活

在默认情况下,sort()方法按升序排列数组项—即最小的值位于最前面,最大的值排在最后面,为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。

即使数组中的每一项都是数值,sort()方法比较的也是字符串。

var values = [0,1,5,10,15]
values.sort();
alert(values);//0,1,10,15,5

sort()方法可以接收一个比较函数作为参数,以便我们制定哪个值位于哪个值前面。
比较函数接收两个如果第一个参数应该位于第二个参数之前返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个参数后则返回一个正数。

function compare(value1,value2){
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}

这个比较函数可以适用于大多数数据类型,只要将其作为参数传递给sort()方法即可,如下面例子所示。

var values = [0,1,5,10,15];
values.sort(compare);
alert(values);//0,1,5,10,15

在将比较函数传递到sort()方法之后,数值仍然保持了正确的升序。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数的返回值即可。

function compare(value1,value2){
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}
var values = [0,1,5,10,15];
values.sort(compare);
alert(values);//15,10,5,1,0