JS_高程5.引用类型(4)Array类型的各类方法
一.转换方法
所有的对象都具有toLocaleString(),toString()和valueOf()方法。调用toString()方法会返回由数组中的每个值的字符串拼接而成的一个以逗号分隔的字符串。而调用valueOf()返回的还是数组。
valueOf() 方法返回 Array 对象的原始值。
该原始值由 Array 对象派生的所有对象继承。
valueOf() 方法通常由 JavaScript 在后台自动调用,并不显式地出现在代码中。
注意: valueOf() 方法不会改变原数组。
eg:
1 var colors=["red","green","blue"]; 2 alert(colors.toString()); //red","green","blue 3 alert(colors.valueOf()); //red","green","blue 4 alert(colors); //red","green","blue 5 alert(typeof(colors.toString()));//string 6 alert(typeof(colors.valueOf())); //object 7 alert(Object.prototype.toString.call(colors.valueOf()));//[object Array]
由上面的例子可以看出,调用数组的toString()方法,返回的是数组的字符串形式,调用valueOf()方法返回的还是数组。这里需要注意的是,由于alert()要接收字符串参数,所以它会在后台调用toString()方法,因此会得到与直接调用toString()方法相同的结果。
toLocaleString()方法
toLocaleString()方法也会创建一个数组值的以逗号分隔的字符串,与toString()和valueOf()不同的是它为了取得每一项的值,调用的是每一项的toLocaleString()方法,而不是toString()方法。
eg:
1 var person1={ 2 toLocaleString:function(){ 3 return "toLocale1"; 4 }, 5 toString:function(){ 6 return "toSt1"; 7 } 8 } 9 var person2={ 10 toLocaleString:function(){ 11 return "toLocale2"; 12 }, 13 toString:function(){ 14 return "toSt2"; 15 } 16 } 17 var person=[person1,person2]; 18 alert(person); //toSt1,toSt2,因为它调用的是toString方法。 19 alert(person.toString()); //toSt1,toSt2 20 alert(person.toLocaleString()); //toLocale1,toLocale2
数组继承的toLocaleString(),toString()和valueOf()方法,在默认情况下都会以逗号分隔的字符串的形式返回数组项。使用join()方法,可以使用自定义的分隔符来构建这个字符串,join()方法只接受一个参数,即用作分隔符的字符串,然后返回使用数组项的字符串。
eg:
1 var colors=["red","green","blue"]; 2 alert(colors.join(",")); //red,green,blue 3 alert(colors.join("||"));//red||green||blue 4 alert(colors.join(undefined));//red,green,blu
注意:
(1)如果不给join()方法传入任何值,或者给它传入undefined,则使用逗号作为分隔符。IE7及更早的版本会错误的使用字符串“undefined”作为分隔符。
(2)如果数组中的某一项的值是null或是undefined,那么该值join(),toLocaleString(),toString()和valueOf()方法返回的结果中以空字符串表示。
二.栈方法
栈是一种LIFO(Last-In-First-Out 后进先出)的数据结构,即最新添加的项最早被移除。栈中项的插入(推入)和移除(弹出),值发生在栈顶。ECMAScript提供push()和pop()方法来实现类似栈的行为。
1.push(),添加项,返回修改后的数组长度。
2.pop(),减少,返回移除的项。
eg:
1 var colors=new Array(); 2 var count=colors.push("red","green"); 3 alert(count);//2 4 count=colors.push("pink"); 5 alert(count);//3 6 var item=colors.pop(); 7 alert(item);//pink 8 alert(colors);//red,green
栈方法可以和其他数组方法一起使用。
三.队列方法
队列数据结构的访问规则是FIFO(First-In-First-Out,先进先出)。队列在列表的末端添加项,在列表的前端移除项。
1.push()
2.shift(),移除数组中的第一项,并且返回改项。
eg:
1 var colors=new Array(); 2 var count=colors.push("red","green"); 3 alert(count);//2 4 count=colors.push("pink"); 5 alert(count);//3 6 var item=colors.shift();//red 7 alert(item);//red 8 alert(colors);//green,pink
3.相反方向的队列,即在数组的前端添加项,在末端移除项。
(1)unshift(),添加,在数组的前端添加任意个项并返回数组的长度。
(2)pop()
eg:
1 var colors=new Array(); 2 var count=colors.unshift("red","green"); 3 alert(count);//2 4 count=colors.unshift("pink"); 5 alert(count);//3 6 var item=colors.pop();//green 7 alert(item);//green 8 alert(colors);//pink,red
注意:
IE7及更早的版本对Javascript的实现中存在偏差,其unshift()方法总是返回undefined而不是数组的新长度,IE8在非兼容模式下会返回正确的长度值。
四.重排序方法
1.reverse()方法:反转数组项的顺序。
eg:
1 var values=[1,2,3,4,5]; 2 values.reverse(); 3 alert(values);//5,4,3,2,1
2.sort()方法:按升序排列数组项,即最小的值在最前面,最大的值在最后面,但是要注意的是:sort()方法会调用每个数组项的toString()方法转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。
eg:
1 var values=[1,2,3,4,5,10,11]; 2 values.sort(); 3 alert(values);//1,10,11,2,3,4,5
说明(W3C)
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
eg:
1 function compare(value1,value2){ 2 if(value1<value2){ 3 return -1; 4 }else if(value1>value2){ 5 return 1; 6 }else{ 7 return 0; 8 } 9 } 10 var values=[1,2,3,4,5,10,11]; 11 values.sort(compare); 12 alert(values);//1,2,3,4,5,10,11
也可以通过改变比较函数的返回值,达到降序的效果:
eg:
1 function compare(value1,value2){ 2 if(value1<value2){ 3 return 1; 4 }else if(value1>value2){ 5 return -1; 6 }else{ 7 return 0; 8 } 9 } 10 var values=[1,2,3,4,5,10,11]; 11 values.sort(compare); 12 alert(values);//11,10,5,4,3,2,1
注意:
(1)当然,如果是简单想反转原来的顺序,而不考虑升序降序的问题,使用reserve()要更快一些。
(2)reverse()和sort()方法的返回值是经过排序后的数组。
(3)对于数值类型或者是valueOf()方法会返回数值类型的对象模型,可以使用以下函数:
1 function compare(value1.value2){ 2 return value2-value1; 3 }
由于比较函数通过返回一个小于0,等于0或是大于0的值来影响排序结果,因此减法操作就可以适当地处理这些情况。