数组

数组对象的作用是:使用单独的变量名来存储一系列的值。

如果你有一组数据(例如:车名字),存在单独变量如下所示:

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

元素添加/删除

栈方法

poppush能够让我们使用堆栈那样先入后出使用数组

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]

我们该如何解决这个问题那?

results matching ""

    No results matching ""