在使用构造函数建立数组时若是传入一个数字参数,则会建立一个长度为参数的数组,若是传入多个,则建立一个数组,参数做为初始化数据加到数组中数组
var a1 = new Array(5);
console.log(a1.length);//5
console.log(a1); //会生成一个length为5,每个都是undefined的数组
var a2 = new Array(5,6);
console.log(a2.length);//2
console.log(a2); //[5,6]
复制代码
数组(array
)是按次序排列的一组值。每一个值的位置都有编号(从0开始),整个数组用方括号表示。bash
JS理解:数据就是原型链中有 Array.prototype
的对象函数
当咱们声明一个 var a1 = [1, 2, 3];
的时候,会生成一个有四个 key
数组对象。为何 a1
它有 push
函数呢 由于咱们链接到了一个公用对象,能够在公用对象中找到,它的 __proto__
指向 Array.prototype
ui
var a = [1, 2, 3]
var obj = {
0: 1,
1: 2,
2: 3,
length: 3
}
复制代码
这两个声明其实不是同一个对象,为何呢?spa
由于它们的公用属性是不同的。a.__proto__
指向的是数组的公用属性 Array.prototype
,这个公用属性有 push
、pop
等函数,Array.__proto__
指向的是 Object.prototype
。而 obj.__proto__
并无指向 Array.prototype
,它是 Object
构造出来的,直接指向 Object.prototype
。也就是说这两个对象自己的内存是没有区别的,它的区别在于原型是不同的。数组之因此为数组,是由于它拥有数组的特色,对象之因此为对象,是由于它没有数组的特色。因此数组和对象本质的区别就是它们的 __proto__
有没有指向 Array.prototype
。 prototype
数组的值能够经过天然数索引访问进行读写操做,下标也能够是一个得出非负整数的变量或表达式3d
var a1 = [1,2,3,4];
console.log(a1[0]); //1
var i=1;
console.log(a1[i]); //2
console.log(a1[++i]); //3
复制代码
数组也是对象,咱们可使用索引的奥秘在于,数组会把索引值转换为对应字符串 (1 => '1')
做为对象属性名code
console.log(1 in a1);//true,确实是一个属性
复制代码
这样咱们能够看出全部的索引都是属性名,但只有天然数(有最大值)才是索引。数组的索引能够不是连续的,访问 index
不存在的元素的时候返回 undefined
cdn
var a = new Array(1,2,3);
a[100] = 100;
console.log(a.length); //101
console.log(a[3]); //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]
复制代码
这时候会发现 a[2]
和 a[100]
被自动删除了,同理,若是把 length
设置为大于最大 index+1
的值的时候,数组也会自动扩张,可是不会为数组添加新元素,只是在尾部追加空空间
a.length=5;
console.log(a); //[1,2] //后面没有3个undefined
复制代码
splice()
splice
方法用于删除原数组的一部分红员,并能够在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。方法有三个参数,开始索引,删除元素的位移和插入的新元素,固然也能够写多个。
splice
的第一个参数是删除的起始位置(从 0 开始),第二个参数是被删除的元素个数。若是后面还有更多的参数,则表示这些就是要被插入数组的新元素var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(4, 2) // ["e", "f"]
a // ["a", "b", "c", "d"]
a.splice(4, 2, 1, 2) // ["e", "f"]
a // ["a", "b", "c", "d", 1, 2]
复制代码
splice
方法的第二个参数能够设为 0var a = [1, 1, 1];
a.splice(1, 0, 2) // []
a // [1, 2, 1, 1]
复制代码
slice()
slice
方法用于提取目标数组的一部分,返回一个新数组,原数组不变。
var a = [1,2,3,4,5];
a.slice(1,2);//2 从 a 下标为1开始,到下标为2结束(不包括2),作为新数组,原数组不变
复制代码
reverse()
reverse
方法用于将数组逆序,与以前不一样的是它会修改原数组
var a = [1,2,3,4,5];
a.reverse();
console.log(a); //[5, 4, 3, 2, 1]
复制代码
join()
join
方法是把数组元素(对象调用其 toString()
方法)使用参数做为链接符链接成一字符串,不会修改原数组内容。若是不提供参数,默认用逗号分隔。
var a = [1, 2, 3];
a.join(' ') // '1 2 3'
a.join(' . ') // "1 . 2 . 3"
a.join() // "1,2,3"
复制代码
concat()
看起来像是剪切,但这个真不是形声字,concat
方法用于拼接数组,a.concat(b)
返回一个 a 和 b 共同组成的新数组,一样不会修改任何一个原始数组,也不会递归链接数组内部数组。
var a = [1,2,3,4,5];
var b = [6,7,8,9];
console.log(a.concat(b)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(a); //[1, 2, 3, 4, 5]
console.log(b); //[6, 7, 8, 9]
复制代码
forEach()
forEach
方法对数组的全部成员依次执行参数函数,该函数接受三个参数:value
、key
、整个数组。
var a = ['a', 'b', 'c'];
a.forEach(function(q, w, e){
console.log(q, w, e)
})
// a 0 (3) ["a", "b", "c"]
// b 1 (3) ["a", "b", "c"]
// c 2 (3) ["a", "b", "c"]
复制代码
sort()
sort
方法对数组成员进行排序,默认是按照转换为的字符串的诸个字符的 Unicode 位点进行排序。排序后,原数组将被改变。
[4, 3, 2, 1].sort()
// [1, 2, 3, 4]
复制代码
若是想让sort方法按照自定义方式排序,能够传入一个函数做为参数。
var items = [
{ name: 'Edward', value: 37},
{ name: 'Sharpe', value: 24},
{ name: 'And', value: 45 }
];
items.sort(function (a, b) {
return (a.value - b.value)
});
// {name: "Sharpe", value: 24}
// {name: "Edward", value: 37}
// {name: "And", value: 45}
复制代码
sort
的参数函数自己接受两个参数,表示进行比较的两个数组成员。若是该函数的返回值大于 0,表示第一个成员排在第二个成员后面;其余状况下,都是第一个元素排在第二个元素前面。
map()
map
方法对数组中每一元素进行处理,函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组保持不变。
var arr = [1, 2, 3, 4, 5, 6]
arr.map(function(val){
return val*val
// [1, 4, 9, 16, 25, 36]
复制代码
filter()
filter
方法用于过滤数组成员,接受一个函数,全部数组成员依次执行该函数,返回结果为 true
的成员组成一个新数组返回。
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr.filter(function (val) {
return (val > 5);
})
// [6, 7, 8, 9]
复制代码
reduce()
reduce
方法依次处理数组的每一个成员,两元素(或参数)执行操做,数组元素返回组合成一个值,遍历数组,继续和数组中 其余元素组合,最终得出结果。
var arr = [1, 2, 3, 4, 5]
arr.reduce(function (a, b) {
console.log(a, b);
return a + b;
})
// 15
复制代码
map
能够用 reduce
表示var a = [1, 2, 3]
a.reduce(function(arr, n){
arr.push(n * 2)
return arr
}, [])
// [2, 4, 6]
复制代码
filter
能够用 reduce
表示var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.reduce(function(arr, n){ if(n % 2 === 0){
arr.push(n)
}
return arr
}, [])
// [2, 4, 6, 8, 10]
复制代码