数组
数组是存放任意数据类型值的集合,容器。在数组字面量中,数组使用"[]“作为数组的边界,数组由多个元素组成,元素与元素之间通过”,"隔开,元素可以为任意数据类型。数组是一种特殊的对象,通过length属性来获取数组的长度(也就是数组中元素的个数)
1.数组的定义
(1)数组字面量:var arr = [ ];
(2)构造函数:var arr = new Array();
使用typeof检查一个数组时,会返回object
获取数组中的长度(数组中元素的个数):arr.length
Object,Array,arr的区别:
Object和Array是构造函数(类似于Java的类)
构造函数可以创建对象,Array是一种特殊的对象
Array继承Object,Array是构造arr的构造函数
arr属于Array的一个实例(具体化)
例如:1. 创建一个长度为length的数组:var arr = new Array(length);
var arr = new Array(2);
var arr = [undefined,undefined];
- 创建一个数组,数组中的元素使用实参初始化:
var arr = new Array(p1,p2,...);
var arr = new Array(1,2,3);
var arr = [1,2,3];
2. 数组的访问
通过索引来访问,索引从0开始的,直到数组的长度-1,索引可以超过索引范围,只不过访问的值为undefined
var arr = [1,2,3]; // 索引为:0~2
arr[0] --------> 1
arr[100] --------> undefined
3. 数组的遍历
(1)普通for循环
var arr = [1,2,3];
for(var i=0;i<arr.length;i++){
var item = arr[i];
}
把遍历封装为一个函数:
fnction each(array){
for(var i=0;i<arr.length;i++){
var item = arr[i];
console.log(item);
}
}
(2)while循环
(3)do-while循环
(4)增强for循环
for(var key in arr){
var val = arr
}
4. 数组在内存中的表现
Array在内存中的表现及Array与arr的关系:
Array === Array.prototype.constructor
arr可以调用其自身的方法及原型中的方法(Array的原型),但不可以调用构造函数Array中的方法
Array自身的方法:from()、of()、isArray() arr不可调用这些方法
5.数组api
arr可以调用Array.prototype的方法,也可以调用Object.prototype中的方法
api (应用程序编程接口)
从作用、参数、返回值三方面进行学习
(1)添加或者移除元素 【对原值进行了改变】
- push() 入栈,将元素添加到数组的最后
参数:入栈的元素
返回值:入栈后数组的长度 - pop() 出栈,将数组中的最后一个元素移除,并且返回
参数:none
返回值:被出栈的元素 - shift() 出队,将数组中的第一个元素移除,并且返回
参数:none
返回值:被移除的元素 - unshift() 插队,将元素添加到数组的最前面
参数:插队的元素
返回值:插队后数组的长度
(2)排序方法【改变原值】
- reverse() :反转数组项的顺序
- sort():可以对数组中的内容按Unicode编码表排序
默认情况下,按照每位字符在字符编码表中出现的位置进行排序,即使是纯数字的数组
可以给sort()添加一个比较器函数:comparator
comparator要求:
- 接受两个参数a,b;
- 如果a在b之前返回-1
- 如果a在b之后返回1
(3) 截取方法
-
concat() 【不改变原值】
数组拼接,先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,返回数组
参数:多个数组
返回值:合并的后的新数组 -
slice(begin [,end])【不改变原值】
数组切割,可接受一个或者两个参数,即(返回项的起始位置,结束位置)。
- 若一个,即表示从该参数指定的位置开始,到当前数组末尾的所有项。
- 若两个,则表示起始到结束位置之间的所有项,包含起始位置但是不包含结束位置的项。
参数: begin表示截取的开始位置;end默认为0
返回值:截取后的子数组
参数为负数时,切割位置为:数组长度+负数=索引位置
-
splice()【改变原数组】
向数组中插入数据,始终返回一个数组。该返回的数组为从原始数组中删除的项。- 删除:指定一个参数,删除该参数为索引后的所有项,包含该项
var arr=[1,2,3,4]
arr.splice(2)------>arr = [1,2]
指定两个参数(删除的起始位置,要删除的项个数),包含起始位置
arr.splice(2,1)------>arr = [1,2,4]
- 插入:指定三个数(起始位置,0,要插入的项值)
arr.splice(3,0,100)----->arr = [1,2,3,100,4]
插入在索引位置前面 - 替换:指定三个数(起始位置,要替换的项数,要替换的项值)
arr.splice(0,2,100)----->arr = [100,3,4]
返回值:被删除的元素组成的数组
- 删除:指定一个参数,删除该参数为索引后的所有项,包含该项
(4)索引方法
- indexOf()
从数组开头向后查找,使用全等操作符,返回查找到的索引位置
返回查找到的第一个全等值的索引,找到后就不会继续查找 - lastIndexOf()
从数组末尾向前查找,使用全等操作符,返回查找到的索引位置
(5)序列表
-
JSON
JSON.stringify():序列化字符串方法
JSON.parse():将字符串转化为对象 -
数组–>字符串
join():将数组元素转化为字符串
参数:写的参数是什么,就用该字符串连接arr中的每个元素(默认,
连接)
例:arr.join("*");
使用*
连接arr中的每个元素
(6)迭代
(1)循环方法forEach()
对数组中的每一元素运行给定的函数,没有返回值,常用来遍历元素
例:
var result = arr.forEach(function(item,index,arr){
console.log(item)
})
- item:当前遍历的元素
- index:索引
- arr:当前数组
也可以只传一个参数,当只有一个参数时,返回值为当前遍历的元素
两个参数时,返回值为当前遍历元素及其索引
改写myForEach():
Array.prototype.myForEach = function(handler){
for(var i=0;i<this.length;i++){
handler.call(this,this[i],i,this)
}
}
arr.myForEach(function(item,index,arr){})
(2)every【每个】
对数组中的每一运行给定的函数,如果该函数对每一项都返回true,则该函数返回true
var arr = [11,5,23,7,4,1,9,1];
var result = arr.every(function(item,index,arr){ return item >2;
});
console.log(result); -----------> false(返回布尔值)
当回调函数每次都返回true,返回值才为true
当回调函数有一次返回false,返回值就为false,并且会停止执行
(3) some【存在】
对数组中的每一运行给定的函数,如果该函数对任一项都返回true,则返回true
var result = arr.every(function(item,index,arr){
return item >2;
});
console.log(result); ---------> true
当回调函数每次都返回false,返回值才为false
当回调函数有一次返回true,返回值就为true,并且会停止执行
(4)filter【过滤】
对数组中的每一运行给定的函数,会返回满足该函数的项组成的数组
var result = arr.filter(function(item,index,arr){
return item >2;
});
console.log(result); --------> [11, 5, 23, 7, 4, 9]
当回调函数返回true的时候,当前元素会被添加到返回值数组中
(5)map【映射】
对数组中的每一元素运行给定的函数,返回每次函数调用的结果组成的数组
var result = arr.map(function(item,index,arr){ return item * 2;
});
console.log(result); -----------> [22, 10, 46, 14, 8, 2, 18, 2]
将回调函数的返回值组成一个新的数组返回