一.数组对象
作用:
使用单独的变量名来存储一系列的值。
JavaScript中创建数组有两种方式
(一)使用 Array 构造函数:
var arr1 = new Array(); //创建一个空数组
var arr2 = new Array(20); // 创建一个包含20项的数组
var arr3 = new Array("lily","lucy","Tom"); // 创建一个包含3个字符串的数组
(二)使用数组字面量表示法:
var arr4 = []; //创建一个空数组
var arr5 = [20]; // 创建一个包含1项的数组
var arr6 = ["lily","lucy","Tom"]; // 创建一个包含3个字符串的数组
二.数组方法
数组转换方法
1.join()
把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
Array.join()
join()方法只接收一个参数,用作分隔符的字符串,然后返回包含所有数组项的字符串
如果不给join()方法传入任何值,则使用逗号作为分隔符
var
a = [1,2,3];
console.log(a.join());
//'1,2,3'
console.log(a.join(
' '
));
//'1 2 3'
console.log(a.join(
''
));
//'123'
var
b =
new
Array(10);
b.join(
'-'
);
//'---------',9个连字符组成的字符串
- 若join()方法的参数是undefined,标准浏览器以逗号为分隔符返回字符串,而IE7-浏览器以'undefined'为分隔符返回字符串
- 如果数组中的某一项的值是null或者undefined,则该值在join()方法返回的结果中以空字符串表示
栈和队列方法
push()和pop()方法允许将数组当作栈来使用。push和pop从数组的尾部添加,从尾部删除。
栈是一种LIFO(Last-First-Out,后进先出)的数据结构,也就是最新添加的项最早被移除。
而栈中项的插入和移除,只发生在一个位置——栈的顶部。栈只能从栈顶操作,半开口。
push()和shift()可以构成类似队列的方法。push从数组尾部添加,shift从数组前端删除。
队列数据结构的访问规则是FIFO(first-in-first-out,先进先出)。队列在列表的末端添加项,从列表的前端移除项。
1.push()
方法可以接收任意数量的参数,把它们
逐个
添加到数组末尾,并
返回修改后数组的长度。
var
a = [];
console.log(a,a.push(1));
//[1] 1
console.log(a,a.push(
'a'
));
//[1,'a'] 2
console.log(a,a.push(
true
, {}));
//[1,'a',true,{}] 4
console.log(a,a.push([5,6]));
//[1,'a',true,{},[5,6]] 5
2.pop()
方法从数组末尾
移除最后一项
,减少数组的length值,然后
返回移除的项
。
var
a = [
'a'
,
'b'
,
'c'
];
console.log(a,a.pop());
// ['a', 'b'] 'c'
- 给pop参数传其他数字不起作用,也不报错。还是只删除最后一项。
- 对空数组使用pop()方法,不会报错,而是返回undefined
3.shift()
方法
移除
数组中的
第一个
项并
返回该项
,同时数组的长度减1。
var
a = [
'a'
,
'b'
,
'c'
];
console.log(a,a.shift());
//['b', 'c'] 'a'
var
arr6 = [1];
console.log(arr6,arr6.shift()); //[] 1
对空数组使用shift()方法,不会报错,而是返回undefined
var
a = [];
console.log(a,a.shift());
// [] undefined
4.unshift()
方法在数组
前端添加
任意个项并
返回新数组长度
。
var
a = [
'a'
,
'b'
,
'c'
];
console.log(a,a.unshift(
'x'
));
//['x', 'a', 'b', 'c'] 4
当传入多个参数时,是一次性插入
。
这意味着最终的数组中插入的元素的顺序和它们在参数列表中的顺序一致
var
a = [
'a'
,
'b'
,
'c'
];
console.log(a,a.unshift(
'x'
,
'y'
,
'z'
));
//['x','y','z','a', 'b', 'c'] 6
- 在IE7-浏览器中,unshift()方法的返回值总是undefined
总结:
p开头
(屁股hhh)的是在数组尾部操作,长的是添加(push,unshift),短的是删除(pop,shift)。
添加的可以接收多个参数并返回增加后数组的长度,删除的一次只能删一个并返回删除项。
删除操作对空数组使用,不会报错,会返回undefined。
数组排序方法
数组中存在两个可以直接用来重排序的方法: reverse()和sort()
5.
reverse()
方法用于
反转数组
的顺序,返回经过排序之后的数组;而原数组顺序也发生改变
var
array = [1,2,4,3,5];
console.log(array,array.reverse());
//[5,3,4,2,1] [5,3,4,2,1]
var
array = [
'str'
,
true
,3];
console.log(array,array.reverse());
//[3,true,'str'] [3,true,'str']
6.sort()
(1)没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。
sort方法会调用每个数组项的toString()方法,然后比较得到的字符串排序,返回经过排序之后的数组,而原数组顺序也发生改变。
var
array = [2,1,4,3,5];
console.log(array,array.sort());
//[1,2,3,4,5] [1,2,3,4,5]
var
array = [
'3str'
,3,2,
'2'
];
console.log(array,array.sort());
//[2, "2", 3, "3str"] [2, "2", 3, "3str"]
- 如果数组包含undefined元素,它们会被排到数组的尾部
sort()方法比较的也是字符串,因此会出现以下的这种情况:
var
array = [1,5,10,50];
console.log(array,array.sort());
//[1, 10, 5, 50] [1, 10, 5, 50]
为了解决上述问题,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。
(2)
arrayObject.sort(
sortby) 参数
可选。规定排序顺序。必须是函数。
比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:
var arr7 = [45,6,21,4,10];
console.log(arr7.sort(compare));
function compare (a,b) {
if(a<b){
return -1;
}else if(a>b){
return 1;
}else return 0;
}
总结:
//升序
function com(value1,value2){
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
}
var values=[0,1,3,5,15,10];
values.sort(com);
alert(values);
//0,1,3,5,10,15
如果需要通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可。
//逆序
function com1(value1,value2){
if(value1<value2){
return 1;
}else if(value1>value2){
return -1;
}else{
return 0;
}
}
var values=[0,1,3,5,15,10];
values.sort(com1);
alert(values);
//15,10,5,3,1,0
对于数值类型或valueOf()方法会返回数值类型的对象类型,比较函数可以简化
function
compare(value1,value2){
return
value1 - value2;
}
var
array = [
'5px'
,50,1,10];
//当数字与字符串比较大小时,字符串'5px'会被转换成NaN,这样结果就是false
console.log(array.sort(compare));
//["5px",1, 10, 50]
【tips】使用sort()方法创建一个随机数组
function
compare(){
return
Math.random() - 0.5;
}
var
array = [1,2,3,4,5];
console.log(array.sort(compare));
//[2,1,5,4,3]
数组拼接方法
7.concat()
方法基于当前数组中的所有项创建一个新数组,先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。
所以concat()不影响原数组
。
如果不给concat()方法传递参数时,它只是复制当前的数组;
var arr = [1,2,3];
console.log(arr,arr.concat()); //[1,2,3] [1,2,3]
如果参数是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中;
console.log(arr,arr.concat([6,7,8],[77,33,44]));
//[1, 2, 3] [1, 2, 3, 6, 7, 8, 77, 33, 44]
var arr1 = [4,5,6];
console.log(arr,arr.concat(arr1)); //[1,2,3] [1,2,3,4,5,6]
如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾。
console.log(arr,arr.concat(4,5));//[1,2,3] [1,2,3,4,5]
console.log(arr,arr.concat(4,[5,[6,7]]));
//[1,2,3] [1, 2, 3, 4, 5, [6,7]]
浅拷贝
如果不提供参数,concat()方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是如果数组成员包括复合类型的值(比如对象),则新数组拷贝的是该值的引用。
//该方法实际只复制了数组的第一维。
数组第一维存放的是第二维的引用,而第二维才是实际存放他们的内容
var
numbers = [1,2];
var
newNumbers = numbers.concat();
console.log(numbers,newNumbers);
//[1,2] [1,2]
numbers[0] = 0;
console.log(numbers,newNumbers);
//[0,2] [1,2]
var
numbers = [[1,2]];
var
newNumbers = numbers.concat();
console.log(numbers,newNumbers);
//[[1,2]] [[1,2]]
numbers[0][0] = 0;
console.log(numbers,newNumbers);
//[[0,2]] [[0,2]]
创建子数组方法
8.slice()
方法基于当前数组中的一个或多个项创建一个新数组,接受一个或两个参数,最后
返回新数组
,所以slice()
不影响原数组
。
slice(start,end)方法需要两个参数start和end,返回这个数组中从start位置到(但不包含)end位置的一个子数组。左闭右开。
- 如果end为undefined或不存在,则返回从start位置到数组结尾的所有项
- 如果没有参数,则返回原数组
- start和end无法交换位置
- 如果start是负数,则start = max(length + start,0)
- 如果end是负数,则end = max(length + end,0)
如果不提供参数,slice()方法返回当前数组的一个浅拷贝
数组删改方法
9.splice()
方法用于删除原数组的一部分成员,并可以在被删除的位置添加入新的数组成员,该方法会改变原数组。splice()返回一个由删除元素组成的数组,或者如果没有删除元素就返回一个空数组
- 如果只提供一个元素,相当于将原数组在指定位置拆分成两个数组
splice()的第一个参数start指定了插入或删除的起始位置。
第二个参数number指定了应该从数组中删除的元素的个数。
如果后面还有更多的参数,则表示这些就是要被插入数组的新元素
数组位置方法
10.indexOf(search,start)
方法接收search和start两个参数,返回search首次出现的位置,如果没有找到则返回-1。
search参数表示要搜索的项;使用严格相等运算符(===)进行比较
11.lastIndexOf(search,start)
方法与indexOf()不同,lastIndexOf()从右向左查找。
接收search和start两个参数,返回search第一次出现的位置,如果没有找到则返回-1
数组归并方法
数组归并方法包括reduce()和reduceRight()方法两种,它们使用指定的函数将数组元素进行组合,生成单个值。
reduce()方法需要两个参数。第一个是执行化简操作的函数。化简函数的任务就是用某种方法把两个值组合或化简为一个值,并返回化简后的值
数组迭代方法
map()
方法对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组
map()方法还可以接受第二个参数,表示回调函数执行时this所指向的对象
forEach()
方法对数组中的每一项运行给定函数,这个方法没有返回值。本质上与for循环迭代数组一样。如果需要有返回值,一般使用map方法
forEach()方法除了接受一个必须的回调函数参数,第二个参数还可以接受一个可选的上下文参数(改变回调函数里面的this指向)
filter()
方法对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。该方法常用于查询符合条件的所有数组项
filter()方法还可以接受第二个参数,指定测试函数所在的上下文对象(this对象)
some()
方法对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。并且当且仅当数值中的所有元素调用判定函数都返回false,它才返回false
在空数组上调用some()方法会返回false
every()
方法对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true;只要有一项返回false,则返回false
http://www.jb51.net/article/88899.htm JavaScript中数组的22种方法必学
http://www.cnblogs.com/xiao-hong/p/3194027.html Js
数组——
filter()
、
map()
、
some()
、
every()
、
forEach()
、
lastIndexOf()
、
indexOf()
http://www.w3school.com.cn/jsref/jsref_obj_array.asp JavaScript Array
对象