JavaScript中数组对象详解

Array对象就数组对象用于在么变量中储存多只价,JS的数组是弱类型的,所以同意数组中包含不同档次的素,数组元素还可以是目标或其他数组。

  • 缔造数组的语法

1、Array构造器

1、var list=new Array();
2、var list=new Array(size);
3、var list=new Array(element0,element1,...elementn);

2、字面量的方法

var Array[element0,element1,...elementn];

举例子

var list=new Array(1,true,null,undefined,{x:1},[1,2,3]);

var list[1,true,null,undefined,{x:1},[1,2,3]];
  • 频组的分类

1、二维数组,二维数组的真面目是数组中的元素而是数组。

var arr = [[1,2],[a,b]];
alert(arr[1][0]); //a 第2列第1行所在的元素

2、稀疏数组

疏散数组是含从0开始之匪连续索引的数组。在疏散往往组中一般length属性值比其实元素个数大(不广泛)
举例
var a=["a",,"b",,,,"c",,];

  • 数组对象属性
属性 作用
length 属性 表示数组的长度,即其中元素的个数
prototype 属性 返回对象类型原型的引用
constructor 属性 表示创建对象的函数

1、length 属性

经过一些操作来讲解length属性
var arr=[1,2,3,4,5,6,7,8,9,10];//定义了一个富含10单数字的数组。
数组的长属性是可变的

alert(arr.length); //显示数组的长度10
arr.length=15; //增大数组的长度,length属性是可变的
alert(arr.length); //显示数组的长度已经变为15

拜数组元素

alert(arr[3]); //显示第4个元素的值,为4

减多少数组长度

arr.length=2; //将数组的长度减少到2,数组中的元素只剩下索引值小于2的元素
alert(arr[9]); //这时候显示第10个元素已经变为"undefined"因为索引值大于等于2的元素都被抛弃了

卷土重来数组长度

arr.length=10; //将数组长度恢复为10
alert(arr[9]); //长度恢复之后已经抛弃的元素却无法收回,显示"undefined"

2、prototype 属性

prototype 属性返回对象类型原型的援。prototype 属性是object共有的。
objectName.prototype
objectName 参数是object目标的名号。

证实:用 prototype 属性提供靶的接近的如出一辙组基本功能。
对象的初实例“继承”赋予该对象原型的操作。

对数组对象,用以下例子说明prototype 属性的用处。
让数组对象上加返回数组中不过深首素值的法子。要做到就一点,声明一个函数,将它们在
Array.prototype, 并使用它。

function array_max( )
{
   var i, max = this[0];
   for (i = 1; i < this.length; i++)
   {
       if (max < this[i])
       max = this[i];
   }
   return max;
}

Array.prototype.max = array_max;
var x = new Array(1, 2, 3, 4, 5, 6);
var y = x.max( );

该代码执行后,y 保存数组 x 中的极可怜价值,或说 6。

3、constructor 属性

constructor 属性表示创建对象的函数。
object.constructor //object大凡目标或函数的称号。
说明:constructor 属性是有所拥有prototype 的靶子的成员。它们包括除 Global 和 Math目标以外的具有JScript土生土长对象。constructor特性保存了针对结构特定目标实例的函数的援。

例如:

x = new String("Hi");
if (x.constructor == String) // 进行处理(条件为真)。
//或
function MyFunc {
// 函数体。
}

y = new MyFunc;
if (y.constructor == MyFunc) // 进行处理(条件为真)。

对此数组来说:

y = new Array();
  • Array的目标方法

证明:部分凡是ECMAScript5的新特性(IE678不支持)

方法 作用
concat() 连接两个或者更多的数组,并返回结果
join() 将数组的元素组起一个字符串
pop() 删除并返回数组的最后一个元素
push() 数组末尾添加一个或者多个元素,返回新的长度
reverse 颠倒数组中元素的顺序
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素
sort() 对数组元素排序
splice() 删除元素,并向数组添加新元素
toSource() 返回该对象的源代码
toString() 把数组转化为字符串并返回结果
toLocalString() 把数组转化为本地元素并返回结果
unshift 向数组开头添加一个或者更多的元素,并返回新的长度
valueof() 返回数组对象的原始值
forEach() 遍历数组对象
map() 对数组做一些映射
filter() 过滤
every() 检查判断
some() 检查判断
reduce() 两两执行一定的操作
reduceRight() 从右到左执行操作
indexOf() 数组检索查找某个元素
Array.isArray([]) 判断是否是数组

要害针对部分新特征开展教学
concat
concat作用是合接数组,需要留意的凡也足以拿一个数组元素作为拼接的因素,如果这样的话,数组会被敌,再同其余的要素拼接起来成为新的累组,但是非会见受关平两次,concat不会见修改原数组。
例如

var arr=[1,2,3,4,5];
arr.concat([10,11],13);//[1,2,3,4,5,10,11,13]
arr.concat([1,[2,3]]);//[1,2,3,4,5,1,[1,3]]

slice
slice(a,b)a和b可以获得负数,表示从a位置上马截取到b位置的一样段落往往组,是一个错误闭右起的距离,a和b可以收获负数,如果是负数代表倒数第a/b个因素

var arr=[1,2,3,4,5];
arr.slice(1,3);//[2,3]
arr.slice(1);//[2,3,4,5]
arr.slice(1,-1);//[2,3,4]
arr.slice(-4,-3);//[2]

splice
splice删除元素并朝数组上加新因素
object.splice(a)自从左开始去a个要素
object.splice(a,b)自打a位置上马截取其中的b个元素
object.splice(a,b,c,d)从a位置上马截取b个要素,并将c和d或者重新多的素插入原数组
消注意的凡splice会修改原数组

var arr=[1,2,3,4,5];
arr.splice(2);//[3,4,5]
arr;//[1,2];原数组被修改了

var arr=[1,2,3,4,5];
arr.splice(2,2);//[3,4]
arr;//[1,2,5];

var arr=[1,2,3,4,5];
arr.splice(1,1,‘a’,‘b’);//[2]
arr;//[1,"a","b",3,4,5];

foreach
foreach()函数从头到尾把数组遍历一布满。有三个参数分别是:数组元素,元素的目,数组本身

var arr = [1, 2, 3, 4, 5];
arr.forEach(function(x, index, a)
{//分别对应:数组元素,元素的索引,数组本身
    console.log(x + '|' + index + '|' + (a === arr));
});
// 1|0|true
// 2|1|true
// 3|2|true
// 4|3|true
// 5|4|true

证实:如果单纯来一个参数那是参数代表数组元素,也就是数组的价,请圈例2。

例2
var data=[1,2,3,4,5,6];
var sum=0;
data.forEach(function(v){//其中的v就是数组的值 123456
sum+=v;})
document.write(sum+"<br>");//打印出来是21

map 
map 对数组做片投,map()
方法返回一个出于本数组中的每个元素调用一个指定方法后底返值组成的新数组,它同forEach的别是forEach为数组中之每个元素执行同一软回调函数。

var arr = [1, 2, 3];
arr.map(function(x) {
     return x + 10;
}); // [11, 12, 13]
arr; // [1, 2, 3]

filter
filter
过滤掉某些因素,和map有点类似,Array的filter也收到一个函数。但是同map不同之凡,
filter把传播的函数依次作用为每个元素,然后因返回值是 true
还是false决定封存还是丢该因素,也就是了滤掉不符合要求的某些因素。

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.filter(function(x, index) {
     return index % 3 === 0 || x >= 8;
}); // returns [1, 4, 7, 8, 9, 10]
arr; // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

every()与some()
every()与some()方法都是JS中数组的迭代方法。every()是针对性数组中之各级一样项运行于定函数,如果该函数对各国一样码返回true,则回true。some()是对数组中各一样宗运行指定函数,如果该函数对任一项返回true,则赶回true。
小结就是every()当每个元素还符合条件的上回来true,而some()是随便一桩满足条件就归true

例1 every()
var arr = [1, 2, 3, 4, 5];
arr.every(function(x) {
     return x < 10;
}); // true

arr.every(function(x) {
     return x < 3;
}); // false

some只待发一个符合的即使实行

例2 some
var arr = [1, 2, 3, 4, 5];
arr.some(function(x) {
     return x === 3;
}); // true

arr.some(function(x) {
     return x === 100;
}); // false

reduce()
Array的reduce()把一个函数作用在此Array的[x1, x2,
x3…]齐,这个函数必须接受两个参数,reduce()把结果连续和排的生一个要素做累积计算,其效果就是是:

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)

var arr = [1, 2, 3];
var sum = arr.reduce(function(x, y) {
     return x + y
}, 0); //参数 0是可选的,如果写了参数0那第一次传递的两个值就是0和1
如果不写第一次传递的就是数组的前两个值,计算结果是6
arr; //[1, 2, 3]

arr = [3, 9, 6];
var max = arr.reduce(function(x, y) {
     console.log(x + "|" + y);
     return x > y ? x : y;
});
// 3|9
// 9|6
max; // 9

reduceRight
和reduce一样只不过reduceRight 变成了从右到左两个别推行某些操作

max = arr.reduceRight(function(x, y) {
     console.log(x + "|" + y);
     return x > y ? x : y;
});
// 6|9
// 9|3
max; // 9

indexOf()
indexOf()
方法而返回某个指定的字符串值在字符串中首不善面世的职,indexOf(a,b)表示找a元素,从b位置上马;lastindexOf表示于右侧为左找。当b为负数的时候表示从今倒数第几个因素开始找寻,请看例子。

var arr = [1, 2, 3, 2, 1];
arr.indexOf(2); // 1
arr.indexOf(99); // -1表示没有这个元素
arr.indexOf(1, 1); // 4
arr.indexOf(1, -3); // 4查找1从倒数第3个元素开始
arr.indexOf(2, -1); // -1查找2从倒数第1个元素开始
arr.lastIndexOf(2); // 3从右边开始找第一次出现2的位置
arr.lastIndexOf(2, -2); // 3从右边的倒数第二个开始找2出现的位置
arr.lastIndexOf(2, -3); // 1

isArray
isArray用来判断是否是反复组,但是isArray是Array构造器对象上的属性,所以不能够一直用isArray,必须要描绘成Array.isArray([]),但是可另外的判断方法直接判断

[]instanceof Array;//true
({}).toString.apply([])==='[object Array]';//true
[].construcror===Array;//true

数组和一般对象的较

  数组 / 一般对象
相同点 都可以继承,对象不一定是数组,都可以当做对象添加属性
不同点 数组自动更新length按索引访问数组比访问一般对象属性明显迅速。数组对象继承Array.prototype上的大量数组操作方法

数组和字符串的于

 

  数组 /字符串
相同点 字符串是数组的一种
不同点 字符串是不可变的数组,字符串没有数组的方法

学学过程ECMAScript中遇见什么问题或者想获得学习资源的言辞,欢迎加入学习交流群
343599877,我们一起学前端!