数组对象的方法(二)
4. slice()方法
说明:slice(start,end)以数组形式返回指定位置的数组元素,不会改变原数组;
解析:
1、start为起始位置(从0开始计),end为终止位置(不包含终止位置)
var arr=[1,2,3,'Tom',"5"];
arr.slice(2,4);//[3, "Tom"]
arr.slice(2,2);//[]
2、如果end没有填,则选取从 start 到数组结尾的所有元素
var arr=[1,2,3,'Tom',"5"];
arr.slice(2);//[3, "Tom", "5"]
arr.slice(1);//[2, 3, "Tom", "5"]
arr.slice();//[1, 2, 3, "Tom", "5"]
3、如果start>=end,则返回为空数组[]
var arr=[1,2,3,'Tom',"5"];
arr.slice(4,3);//[]
arr.slice(3,3);//[]
4、如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度;如果 end 为负,就将它作为 length + end 处理。
var arr=[1,2,3,'Tom',"5"];
arr.slice(-2,4);//["Tom"]
arr.slice(2,-2);//[3]
5、如果start或者end,为正,或者为负(length+负值)超数组长度时,当作边界值处理(0或者数组长度)
如
var arr=[1,2,3,'Tom',"5"];
arr.slice(-6,1);//[1],这里的5-6=-1超过数组长度,当作0处理
var arr=[1,2,3,'Tom',"5"];
arr.slice(4,6);//["5"],这里的6超范围,故当作5处理
arr.slice(6,4);//[],start>=end,故为空
5. splice()方法
newArr=arr.splice(start,delectCount,newItem1,newItem2,…)
1. 从数组中某个位置开始移除连续的一个或多个元素
2. 如有必要,可向原数组中添加新元素
3. 返回的newArr是一个由被删除元素所组成的数组
参数说明:
参数 | 说明 | 必要性 |
---|---|---|
start | 指定操作起始位置,此位置从0开始计算 | 必要 |
delectCount | 要删除元素的数量 | 必要 |
newItem1,newItem2,… | 要插入的新元素,插入位置为start | 非必选 |
举例:
1、删除,添加操作
var arr=[1,2,3,"4","top"];
delArr=arr.splice(1,3,"newItem");//[2, 3, "4"]
console.log(arr)//[1, "newItem", "top"]
2、只进行删除
var arr=[1,2,3,"4","top"];
delArr=arr.splice(1,100);//[2, 3, "4", "top"]
console.log(arr)//[1]
3、只进行添加
6. reverse()和sort()
6.1 语法:reverse()反转数组顺序
var arr1=[1,5,2,3,"xx",4];
arr1.reverse();
console.log(arr1);//[4, "xx", 3, 2, 5, 1]
这个数组方法的作用直观明了,将数组的顺序反转了,但是实际应用中不够灵活,因此有了sort()方法。
6.2 语法:arr.sort(sortfunction)
sort()并不是一个单纯的方法,对,它不单纯。
sort() 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。
sort方法进行10以内的排序,如下:
但是当排序数值含有大于10的数值时,如下:
可见,即便例子中的值没问题,但是sort()方法也会根据测试字符串的结果改变原来的顺序,因为数值2虽然小于11,但是进行字符串比较时,”11”则在”2”“3”前面,于是数组的顺序就被修改了。
这时候,我们就该用到sort(sortfunction)方法中的参数了,如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:
- 负值,如果所传递的第一个参数比第二个参数小。
- 零,如果两个参数相等。
- 正值,如果第一个参数比第二个参数大。
function compare(value1,value2){
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
}
//将上面这个比较函数作为参数传递给sort()方法,进行了升序排序,结果如下
var arr2=[1,2,3,1,11];
arr2.sort(compare);//[1, 1, 2, 3, 11]
//如果想要降序,只需对调比较函数返回的值即可。
当然,sort()可以做的不止是升序排序和降序排序,不同的比较函数将导致不同的排序结果,其他类型此处不再探究。
7. toString 方法
说明:objectname.toString([radix]),返回对象的字符串表示。
参数 | 必要性 | 说明 |
---|---|---|
objectname | 必选项。 | 要得到字符串表示的对象。 |
radix | 可选项。 | 指定将数字值转换为字符串时的进制。 |
var arr=[1,12,3,4];
a.toString();//"1,12,3,4"
这里值得一提的是,Number的toString不同于其他,是比较特殊的;
var num1=10,num2=10.14;
//当没有参数传入时,默认十进制输出
num1.toString();//"10"
num2.toString();//"10.14"
//当传入参数时
num1.toString(2);//"1010"
num1.toString(8);//"12"
num1.toString(10);//"a"
8. valueOf 方法
说明:object.valueOf( )返回指定对象的原始值。
7vs8. toString()和valueOf()的共同点与不同点
共同点:在 JavaScript 中,toString()方法和valueOf()方法,在输出对象时会自动调用。
不同点:二者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中,优先调用了toString。
//例子1如下:
<script>
var obj = {};
obj.valueOf = function()
{
return 10;
}
obj.toString = function()
{
return "return value";
}
var result = obj + 1; //var result = obj.valueOf() + 1;
alert(result);
alert(obj); //alert(obj.toString());
</script>
//例子2如下:
function obj() { }
obj.prototype.toString = function(){
return 'dfsf';
};
obj.prototype.valueOf = function(){
return '3333';
};
var e = new obj();
var o = new obj();
alert(o);//alert(obj.toString())
alert(o+e);//alert(obj.valueOf()+obj.valueOf())
</script>
toString vs valueOf的差别:
返回值类型的差别:
1. toString一定将所有内容转为字符串
2. valueOf取出对象内部的值,不进行类型转换
用途的差别:
1. toString专用于输出字符串
2. valueOf专用于算数计算和关系运算
共同的缺点:无法获取null和undefined的值
9. toLocaleString 方法
说明:toLocaleString能根据区域设置的默认格式把 Date 对象转换为字符串,并返回结果。
文档给出的说明是:
toLocaleString 方法返回一个 String 对象,这个对象中包含了用当前区域设置的默认格式表示的日期。
- 对于公元 1601 和 1999 之间的时间,日期格式要按照用户的“控制面板”中“区域设置”来确定。
- 对于此区间外的其他时间,使用 toString 方法的默认格式。
例如,同样是 1 月 5 日,在美国,toLocaleString 可能会返回 “01/05/96 00:00:00”,而在欧洲,返回值则可能是 “05/01/96 00:00:00”,因为欧洲的惯例是将日期放在月份前面。注意 toLocaleString 只用来显示结果给用户;不要在脚本中用来做基本计算,因为返回的结果是随机器不同而不同的。
例:
ECMAScript5新增
10. 位置方法
- ECMAScript5为数组实例添加了两个位置方法:indexOf()和lastIndexOf()。这两个方法都接收两个参数:(1.要查找的项和2.(可选的)表示查找的起始位置的索引)。
- 其中,indexOf()方法表示从数组开头向后找,lastIndexOf()则从末尾向前查找。找到将返回所找到的项在数组中的位置;如果找不到,则返回-1。寻找项时,使用全等===进行查找匹配。
var numArr=['a','b',3,4,'c'];
alert(numArr.indexOf("b"));//1
alert(numArr.lastIndexOf("b"));//1
alert(numArr.lastIndexOf("B"));//-1
11. 迭代方法
ECMAScript5为数组实例添加了5个迭代方法:
每个方法都接收两个参数:要在每一项上运行的函数 和 (可选的)运行该函数的作用域对象。
传入这些方法中的函数会接收三个参数:数组项的值,该项在数组中的位置,数组对象本身。
方法 | 说明 |
---|---|
forEach() | 对数组中的每一项运行 给定函数。该方法没有返回值。 |
every() | 对数组中的每一项运行 给定函数,如果数组的每一项都返回true,则返回true。 |
some() | 对数组中的每一项运行 给定函数,如果数组的任意一项返回true,则返回true。 |
fliter() | 如果数组的每一项都返回true,则返回true。返回该函数会返回true的项组成的数组。 |
map() | 如果数组的每一项都返回true,则返回true。返回每次函数调用的结果组成的数组。 |
12. 归并方法
.reduce(function(v1,v2),value) / .reduceRight(function(v1,v2),value)
遍历数组,调用回调函数,将数组元素组合成一个值,reduce从数组第一项开始,reduceRight反向,方法有两个参数
1.回调函数:把两个值合为一个,返回结果
2.value,一个初始值(可选)
var a=new Array(1,2,3,4,5,6);
console.log(a.reduce(function(v1,v2){
return v1+v2;
})); // 21,执行了数组所有值求和
console.log(a.reduceRight(function(v1,v2){
return v1-v2;
},100)); // 79
13. Array.isArray(element)
这是Array对象的一个静态函数,用来判断一个对象是不是数组
var a = new Array();
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
因此,对于Array.isArray()不可用的情况下,使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下:
Object.prototype.toString.call(value)
因此可封装Array.isArray方法如下:
if(typeof Array.isArray==="undefined"){
Array.isArray=function(arg){
return Object.prototype.toString.call(arg)==="[object Array]"
}
}