Javascript Array总结
在JavaScript的几个引用类型(Object,Array,Date,RegExp,Function,基本引用类型)中,Array类型应该是除了object应用的最多的类型了。与其他语言不同的是,ECMAscript(JavaScript)中的数组是没有进行强定义的,也就是说,在JavaScript数组中每一项可以存任何的对象。
var test=['alpha','beta',3,false]; alert(test);//['alpha','beta',3,false]
①数组的构建:
在js中构建数组的方式有两种:
1.利用数组的构造函数
var test=new Array();
可以指定数组的大小或者数组中元素。
var test1=new Array(3);//指定大小 var test2=new Array('demo1','demo2',222);//指定内容
1.利用数组字面量表示法:
var test=['alpha','beta',3,false];
在这里得提到的是,js数组的length属性不是一个只读的属性,也就是说,我们可以任意地去修改数组的长度:
<span style="white-space:pre"> </span>var test=new Array('demo1','demo2',333); console.log(test.toString());//'demo1','demo2',333 test[3]='我是第四个'; console.log(test.toString());//'demo1','demo2',333,我是第四个
这样也是不会报错的。通过这一个属性我们就可以在一个数组的最后一直填充值。数组的最大长度为4294967295,这length基本已经已经满足了所有的编程要求了。
②监测数组
如何判断一个对象是否是一个数组?
利用关键字instanceof和Array.isArray();
<span style="white-space:pre"> </span>var test=new Array('demo1','demo2',333); if(test instanceof Array){ alert("test is a array");//test is a array } //该方法支持ie9+ if(Array.isArray(test)){ alert("test is a array");//test is a array }
③ 转换方法
几乎所有的对象都具有toString(),valueOf(),toLocaleString()方法,调用数组的toString()方法会返回由数组中的每一项用字符串形式拼接而成的一个以逗号分隔的字符串。toString()和toLocaleString()一般来说都是返回相同的值,但是应用 的是时候会有细节问题,看下面的代码:
<span style="white-space:pre"> </span>var person1 = { toLocaleString: function() { return "alpha"; }, toString: function() { return "Beta"; } } var person2 = { toLocaleString: function() { return "alpha"; }, toString: function() { return "Alpha"; } } var people = [person1, person2]; <span style="white-space:pre"> </span>alert(people); alert(people.toString()); alert(people.toLocaleString());
这里定义了两个对象person1和person2,分别为两个对象定义了一个toString和toLocaleString方法,这两个方法返回了不同的值。然后创建了一个数组用来存放两个对象,当数组传递给alert的时候,输出的结果是Beta,Alpha,这是因为这里隐式地调用了toString方法,后面是显示调用toString也是一样。当数组调用toLocaleString的时候,输出的是alpha,alpha,原因是调用可数组每一项的toLocaleString方法。
在默认情况下,toString,toLocaleString,valueOf方法都会以逗号分隔的字符串形式返回数组项,如果不想用逗号,可以使用join方法。
<span style="white-space:pre"> </span>var people=['alpha','Beta',3,'names']; console.log(people.join('||'));
如果数组的某一项是null或者undefined,那么在以上的转换方法中返回的结果都会以空字符串。
④栈方法
在JavaScript中,数组是可以当做栈来使用的,栈是一种LIFO的数据结构,也就是说最新添加的元素,最先被移除,而且所有的弹出,推入操作都是发生在一个叫栈顶的地方。JavaScript中提供给了push()和pop()方法来完成对栈的操作。
<span style="white-space:pre"> </span>var newArr=[1,2,3,4,5]; newArr.push(6); alert(newArr.toString());//1,2,3,4,5,6 newArr.pop(); alert(newArr.toString());//1,2,3,4,5
⑤队列方法
既然可以当做栈来使用,那么也就可以当做队列来使用啦,队列的规则是FILO,也就是说先进后出。JavaScript提供了shift()和push()来实现这一操作。
<span style="white-space:pre"> </span>var newArr=[1,2,3,4,5]; newArr.shift(); alert(newArr.toString());//2,3,4,5 newArr.push(6); alert(newArr.toString());//2,3,4,5,6
JavaScript还提供了一个unshift方法,也就是说在队列的前面添加一个元素并且是长度加1.
<span style="white-space:pre"> </span>var newArr=[1,2,3,4,5]; <span style="white-space:pre"> </span>newArr.shift(); <span style="white-space:pre"> </span>alert(newArr.toString());//2,3,4,5 <span style="white-space:pre"> </span>newArr.unshift(6,7);//6,7,2,3,4,5 <span style="white-space:pre"> </span>alert(newArr.toString());
综合利用pop,push,shift,unshift就可以实现很多方法了,比如队列的反向操作之类的。
⑥重排序方法
数组中本身就给了两个重排序的方法,reverse(逆置)和sort(排序)方法。
<span style="white-space:pre"> </span>var newArr=[1,2,3,4,5]; var secArr=[1,3,5,7,2,4]; newArr.reverse(); secArr.sort(); alert(secArr.toString());//1,2,3,4,5,7 alert(newArr.toString());//5,4,3,2,1
关于sort方法,这样看起来貌似是没有问题的,但是其实sort方法的具体实现是:调用每个数组项的toString()方法。也就是说,sort是按照比较字符串大小进行排序的。
<span style="white-space:pre"> </span>var secArr=[1,3,5,7,2,4,11]; <span style="white-space:pre"> </span>secArr.sort(); <span style="white-space:pre"> </span>alert(secArr.toString());//1,11,2,3,4,5,7
这种排序方式在大多数情况下都是不符合要求,那么应该怎么做呢?实际上sort()方法提供了一个可参考的比较函数,这个函数传入两个参数,如果第一个参数应该位于第二个参数之前,那么就会返回-1,相等返回0,位于之后返回1,那么我们只要重写这个方法,并且传入sort()即可按照我们自己的方式完成sort操作。
<span style="white-space:pre"> </span>var secArr=[1,3,5,7,2,4,11]; <span style="white-space:pre"> </span>secArr.sort(compare); alert(secArr.toString());//1,2,3,4,5,7 function compare(value1,value2){ return value1-value2; }
未完待续。。。