数组
数组对象的作用是:使用单独的变量名来存储一系列的值。
如果你有一组数据(例如:车名字),存在单独变量如下所示:
var car1="Saab";
var car2="Volvo";
var car3="BMW";
如果你想从中找出某一辆车?并且不是3辆,而是300辆呢?这将不是一件容易的事!
最好的方法就是用数组。 数组可以用一个变量名存储所有的值,并且可以用变量名访问任何一个值。 数组中的每个元素都有自己的的ID,以便它可以很容易地被访问到。
在程序语言中数组的重要性不言而喻,由于弱类型的原因,JavaScript中数组十分灵活、强大。
不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改。
创建数组
创建一个数组,有三种方法。
下面的代码定义了一个名为 myCars 的数组对象:
构造函数
常规方式
var myCars=new Array();
myCars[0]="Saab";
myCars[1]="Volvo";
myCars[2]="BMW";
简介模式
var myCars=new Array("Saab","Volvo","BMW");
字面量
var myCars=["Saab","Volvo","BMW"];
注意点
1.在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中
var a1 = new Array(2);
console.log(a1.length);// 2
console.log(a1); // [empty × 2]
var a2 = new Array(5,6);
console.log(a2.length);// 2
console.log(a2); // [5,6]
但是使用字面量方式,无论传入几个参数,都会把参数当作初始化内容
var a1 = [2];
console.log(a1.length);// 1
console.log(a1); // [2]
var a2 = [5,6];
console.log(a2.length);// 2
console.log(a2); // [5,6]
访问数组
数组的值可以通过自然数索引访问进行读写操作,下标也可以是一个得出非负整数的变量或表达式
var a1 = ["a","b","c","d"];
console.log(a1[0]); // "a"
var i = 1;
console.log(a1[i]); // "b"
console.log(a1[++i]); // "c"
数组也是对象,数组会把索引值转换为对应字符串(1=>”1”)作为对象属性名,所以我们可以通过取对象的值的方法取出数组中的元素
console.log(a1["1"]);// "b"
索引特殊性在于数组会自动更新length属性,当然因为JavaScript语法规定数字不能作为变量名,所以我们不能显式使用array.1
这样的格式。由此可见其实负数,甚至非数字”索引“都是允许的,只不过这些会变成数组的属性,而不是索引
var a = new Array(1,2,3);
a[-10]="a[-10]";
a["sss"]="sss";
数组的索引可以不是连续的,访问index不存在的元素的时候返回undefined
var a = new Array(1,2,3);
a[100] = 100;
console.log(a.length); //101
console.log(a[3]); //undefined
console.log(a[99]); //undefined
console.log(a[100]); 100
上面的例子中,虽然直接对a[100]
赋值不会影响a[4]
或a[99]
,但数组的长度却受到影响,数组length
属性等于数组中最大的index+1
,我们知道数组的length属性同样是个可写的属性,当强制把数组的length属性值设置为小于等于最大index值时,数组会自动删除indexd大于等于length的数据,在刚才代码中追加几句
a.length = 2
console.log(a);//[1,2]
Array 对象方法
concat()
连接两个或更多的数组,并返回结果
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
var arr2 = new Array(3)
arr2[0] = "James"
arr2[1] = "Adrew"
arr2[2] = "Martin"
console.log(arr.concat(arr2)) // George,John,Thomas,James,Adrew,Martin
join()
join() 方法用于把数组中的所有元素放入一个字符串。
元素是通过指定的分隔符进行分隔的。
var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
console.log(arr.join(".")) // George.John.Thomas
元素添加/删除
栈方法
pop
和push
能够让我们使用堆栈那样先入后出使用数组
pop() 方法用于删除并返回数组的最后一个元素。
pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。
var a = new Array(1,2,3);
a.push(4);
console.log(a);// [1, 2, 3, 4]
console.log(a.length);// 4
console.log(a.pop());// 4
console.log(a); // [1, 2, 3]
console.log(a.length);// 3
队列方法
既然栈方法都实现了,先入先出的队列怎么能少,shift
方法可以删除数组index最小元素,并使后面元素index都减一,length也减一,这样使用shift/push就可以模拟队列了,当然与shift方法对应的有一个unshift
方法,用于向数组头部添加一个元素
如果数组是空的,那么 shift() 方法将不进行任何操作,返回 undefined 值。请注意,该方法不创建新数组,而是直接修改原有的 arrayObject。
unshift() 方法将把它的参数插入 arrayObject 的头部,并将已经存在的元素顺次地移到较高的下标处,以便留出空间。该方法的第一个参数将成为数组的新元素 0,如果还有第二个参数,它将成为新的元素 1,以此类推。请注意,unshift() 方法不创建新的创建,而是直接修改原有的数组。
var a=new Array(1,2,3);
a.unshift(4);
console.log(a);//[4, 1, 2, 3]
console.log(a.length);//4
console.log(a.shift());//4
console.log(a); //[1, 2, 3]
console.log(a.length);//3
splice()
修改数组的终极神器。
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
用法:
arrayObject.splice(index,howmany,item1,.....,itemX)
参数 | 描述 |
---|---|
index | 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 |
howmany | 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 |
item1, ..., itemX | 可选。向数组添加的新项目。 |
var arr = [1,2,3,4,5];
arr.splice(2,1,"a","b") // arr = [1, 2, "a", "b", 4, 5]
slice(start,end)
不要和splice方法混淆,slice方法用于返回数组中一个片段或子数组,如果只写一个参数返回参数到数组结束部分,如果参数出现负数,则从数组尾部计数(-3意思是数组倒第三个,一般人不会这么干,但是在不知道数组长度,想舍弃后n个的时候有些用,不过数组长度很好知道。。。。,好纠结的用法),如果start大于end返回空数组,值得注意的一点是slice不会改变原数组,而是返回一个新的数组
var a = new Array(1,2,3,4,5);
console.log(a); //[1, 2, 3, 4, 5]
console.log(a.slice(1,2));//2
console.log(a.slice(1,-1));//[2, 3, 4]
console.log(a.slice(3,2));//[]
console.log(a); //[1, 2, 3, 4, 5]
reverse()
reverse() 方法用于颠倒数组中元素的顺序。该方法会改变原来的数组,而不会创建新的数组。
var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
console.log(arr.reverse()) // [Thomas,John,George]
sort()
sort() 方法用于对数组的元素进行排序。
arrayObject.sort(sortby)
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
注意,默认情况下会调用对象的toString()
方法,将对象转换为 string 后做比较:
var a=new Array(5,4,3,2,1);
a.sort();
console.log(a);//[1, 2, 3, 4, 5]
但是
var a=new Array(7,8,9,10,11);
a.sort();
console.log(a);//[10, 11, 7, 8, 9]
我们该如何解决这个问题那?