2

数组是数据的有序列表,与其他语言不同的是,ECMAScript 数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二位置来保存数值,用第三个位置来保存对象, 以此类推

牢记:

JavaScript中的数组并不像我们在C或java等语言中遇到的常规数组,在js中数组并不是起始地址+长度构成的一片连续的地址空间。

javascript中数组其实就是个对象,只不过会自动管理一些"数字"属性和length属性罢了。

说的更直接一点,JavaScript中的数组根本没有索引,因为索引应该是数字,而JavaScript中数组的索引其实是字符串

创建数组

构造函数方式

1.无参构造函数,创建一空数组

var colors = new Array();

2.创建指定长度的数组,一个数字参数构造函数,指定数组长度(由于数组长度可以动态调整,作用并不大)

var colors = new Array(5);

3.带有初始化数据的构造函数,创建数组并初始化参数数据

var colors = new Array("red", "blue", "green");

使用Array构造函数是可以省略new操作符,如下:

var colors = Array(3); // 创建一个包含 3 项的数组
var names = Array("Greg"); // 创建一个包含 1 项,即字符串"Greg"的数组

注意,这里有个坑!
同样是使用构造函数的方式,并传递一个值,new Array(2)new Array("2")是有区别的

new Array(2) // ["undefined", "undefined"]
new Array("2") // ["2"]

字面量方式

数组字面量由一对包含数组项的方括号表示,多个数组项之间以逗号隔开,如下所示:

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
var names = []; // 创建一个空数组
var values = [1,2,]; // 不要这样!这样会创建一个包含 2 或 3 项的数组
var options = [,,,,,]; // 不要这样!这样会创建一个包含 5 或 6 项的数组

字面量方式创建数组的兼容问题

字面量数组长度 IE8及以下 IE8以上
["red", "blue", "green"] 3 3
["red", "blue", , "green"] 4 4
["red", "blue", "green", ,] 4 3
[, , , , ,] 6 5

数组 VS 对象

javascript中数组其实就是个对象,只不过会自动管理一些"数字"属性和length属性

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”)作为对象属性名,验证:

console.log(1 in a1);//true,确实是一个属性

索引特殊性在于数组会自动更新length属性,当然因为JavaScript语法规定数字不能作为变量名,所以我们不能显示使用array.1这样的格式。由此可见其实负数,甚至非数字”索引“都是允许的,只不过这些会变成数组的属性,而不是索引

var a = new Array(1,2,3);
a[-10] = "a[-10]";
a["sss"] = "sss";
console.log(a); // [1, 2, 3, -10: "a[-10]", sss: "sss"]

为对象添加数组方法

var blankArray = [];
var obj = {
    splice: blankArray.splice,
    push: blankArray.push,
    unshift: blankArray.unshift,
    pop: blankArray.pop,
    shift: blankArray.shift
};
obj.push();
obj.unshift();
obj.pop();
obj.shift();

数组中的length属性

数组的length属性不是只读的
1.通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组 colors.length = 2;
alert(colors[2]); //undefined

2.利用 length 属性也可以方便地在数组末尾添加新项

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
colors[colors.length] = "black"; //(在位置3)添加一种颜色
colors[colors.length] = "brown"; //(在位置4)再添加一种颜色

3.利用length属性删除/清空数组

var arr = [1,2,3,4];
arr.length = 2;
console.log(arr[2]); // "undefined"

arr.length = 0;
console.log(arr); // []

密集数组与稀疏数组

密集数组:在Java和C语言中,数组是一片连续的存储空间,有着固定的长度。加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......address[n-1]。即数组元素之间是紧密相连的,不存在空隙。如下的js代码创建的就是一个密集数组

var data = [3,1,6,9,2];  

稀疏数组:与密集数组相反,javascript并不强制要求数组元素是紧密相连的,即允许间隙的存在。如下的js代码是合法的:

var sparse = new Array();  
sparse[0] = 0;  
sparse[3] = 3;  
alert(sparse[0]);//输出0  
alert(sparse[1]);//输出undefined 

密集数组的创建: var dense = Array.apply(null, Array(3));

稀疏数组与密集数组便利区别:

// 稀疏数组  
var array = new Array(3);   
array[2] = "name";  
for(var a in array){  
  console.log("index=" + a + ",value=" + array[a]);  
}  
   
// 密集数组  
var dense = Array.apply(null, Array(3));   
dense[2] = "name";  
for(var a in dense){  
  console.log("index=" + a + ",value=" + dense[a]);  
}

// 结果
// 稀疏数组:index=2,value=name
// 密集数组:index=0,value=undefined
//         index=1,value=undefined
//         index=2,value=name

差别稀疏数组只遍历了已存在元素的次数,密集数组遍历了arr.length

伪数组(类数组)

特点:
1.具有length属性;
2.按索引方式存储数据;
3.不具有数组的push()、pop()等方法;

伪数组无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push()、pop()等方法,但仍可以对真正数组遍历方法来遍历它们

常见的伪数组类型:
1.function内的arguments对象;
2.调用getElementsByTagName, document.childNodes之类的,返回的NodeList对象都属于伪数组;
3.自定义对象的伪数组;

如何将伪数组转换成数组?
1.声明一个空数组,通过遍历伪数组把它们重新添加到新的数组(不推荐)

var links = document.querySelectorAll('a');
var arr = [];
for (var i = 0; i < links.length; i++) {
  arr[arr.length] = links[i]
}

2.使用数组的slice()方法 它返回的是数组,使用call或者apply指向伪数组

var arr = Array.prototype.slice.call(links);

3.原型继承

links.__proto__ = Array.prototype;

4.ES6中数组的新方法 from()

var arr = Array.from(links);

清空数组的几种方式

1.length赋值为0

var arr = [1,2,3,4];
arr.length = 0;
console.log(arr); // 输出 [],空数组,即被清空了

2.splice

var arr = [1,2,3,4];
arr.splice(0,arr.length);
console.log(arr); // 输出 [],空数组,即被清空了

3.赋值为[]

var arr = [1,2,3,4];
arr = []; // 赋值为一个空数组以达到清空原数组

同梦奇缘
4.1k 声望1.1k 粉丝

生于忧患死于安乐