数组是一组按序排列的值,相对地,对象的属性名称是无序的。从本质上讲,数组使用数字作为查找键,而对象拥有用户自定义的属性名。javascript没有真正的关联数组,但对象可用于实现关联的功能
Array()仅仅是一种特殊类型的Object(),也就是说,Array()实例基本上是拥有一些额外功能的Object()实例。数组可以保存任何类型的值,这些值可以随时更新或删除,且数组的大小是动态调整的
除了对象之外,数组Array类型可能是javascript中最常用的类型了。而且,javascript中的数组与其他多数语言中的数组有着相当大的区别。本文将介绍javascript中的数组Array类型
创建数组
有两种创建数组的方法:使用字面量语法和使用Array()构造函数
【字面量】
使用数组字面量是创建数组最简单的方法,在方括号中将数组元素用逗号隔开即可
var empty = []; //没有元素的数组 var primes = [2,3,5,7,11]; //有5个数值的数组
虽然javascript数组与其他语言中的数组都是数据的有序列表,但与其他语言不同的是,javascript数组的每一项可以保存任何类型的数据
var misc = [1.1,true, "a"]; //3个不同类型的元素
数组字面量中的值不一定要是常量,它们可以是任意的表达式
var base = 1024; var table = [base,base+1,base+2,base+3];
它可以包含对象字面量或其他数组字面量
var b = [ [1,{x:1,y:2}],[2,{x:3,y:4}] ];
如果数组的元素还是数组,就形成了多维数组
var a = [[1, 2], [3, 4]];
[注意]使用数字字面量表示法时,不会调用Array构造函数
【构造函数】
有三种方式调用构造函数
【1】没有参数,创建一个空数组
//该方法创建一个没有任何元素的空数组,等同于数组直接量[] var a = new Array();
【2】有一个数值参数,该参数用于指定数组的长度
var a = new Array(10); console.log(a);//[] console.log(a[0],a.length);//undefined 10
[注意]若存在一个其他类型的参数,则会创建包含那个值的只有一项的数组
var a = new Array('10'); console.log(a);//['10'] console.log(a[0],a.length);//10 1
【3】有多个参数时,参数表示为数组的具体元素
var a = new Array(1,2,3); console.log(a);//[1,2,3] console.log(a[0],a[1],a[2]);//1 2 3
使用Array()构造函数时,可以省略new操作符
var a1 = Array(); var a2 = Array(10); var a3 = Array(1,2,3); console.log(a1,a2,a3);//[] [] [1,2,3]
数组本质
数组是按次序排列的一组值,本质上,数组是一种特殊的对象
typeof [1, 2, 3] // "object"
数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2…)。由于数组成员的键名是固定的,因此数组不用为每个元素指定键名,而对象的每个成员都必须指定键名
var arr = ['a', 'b', 'c']; console.log(Object.keys(arr));// ["0", "1", "2"] var obj = { name1: 'a', name2: 'b', name3: 'c' };
数组是对象的特殊形式,使用方括号访问数组元素就像用方括号访问对象的属性一样
javascript语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串,然后将其作为属性名来使用
o={}; //创建一个普通的对象 o[1]="one"; //用一个整数来索引它 //数值键名被自动转成字符串 var arr = ['a', 'b', 'c']; arr['0'] // 'a' arr[0] // 'a'
但是,一定要区分数组索引和对象的属性名:所有的索引都是属性名,但只有在0~232-2(4294967294)之间的整数属性名才是索引
var a = []; //索引 a['1000'] = 'abc'; a[1000] // 'abc' //索引 a[1.00] = 6; a[1] // 6
[注意]单独的数值不能作为标识符(identifier)。所以,数组成员只能用方括号法表示
var arr = [1, 2, 3]; arr[0];//1 arr.0;//SyntaxError
可以使用负数或非整数来索引数组。但由于其不在0~2的32次方-2的范围内,所以其只是数组的属性名,而不是数组的索引,明显的特征是不改变数组的长度
var a = [1,2,3]; //属性名 a[-1.23]=true; console.log(a.length);//3 //索引 a[10] = 5; console.log(a.length);//11 //属性名 a['abc']='testing'; console.log(a.length);//11
稀疏数组
稀疏数组就是包含从0开始的不连续索引的数组
【1】制造稀疏数组最直接的方法就是使用delete操作符
var a = [1,2,3,4,5]; delete a[1]; console.log(a[1]);//undefined console.log(1 in a);//false
【2】数组的逗号之间可以省略元素值,通过省略元素值也可以制造稀疏数组
var a =[1,,3,4,5]; console.log(a[1]);//undefined console.log(1 in a);//false
[注意]省略的元素值和值为undefined的元素值是有区别的
var a =[1,,3,4,5]; console.log(a[1]);//undefined console.log(1 in a);//false var a =[1,undefined,3,4,5]; console.log(a[1]);//undefined console.log(1 in a);//true
如果在数组的末尾使用逗号时,浏览器之间是有差别的。标准浏览器会忽略该逗号,而IE8-浏览器则会在末尾添加undefined值