1. 数组是计算机编程世界里最常见的数据结构。任何一种编程语言都包含数组,只是形式上 略有不同罢了。
JavaScript数组的标准定义是:一个存储元素的线性集合(collection),元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。
JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。然而,这些数字索引在内部被转换为字符串类型,这是因为 JavaScript 对象中的属性名必须是字符串。
2. 创建数组
最简单的方式是通过 [] 操作符声明一个数组变量:
var numbers = [];
var numbers = new Array();
print(numbers.length); // 显示 0
同样,可以为构造函数传入一组元素作为数组的初始值:
var numbers = new Array(1,2,3,4,5);
print(numbers.length); // 显示 5
可以只传入一个参数,用来指定数组的长度:
var numbers = new Array(10);
print(numbers.length); // 显示 10
在脚本语言里很常见的一个特性是,数组中的元素不必是同一种数据类型,这一点和很多编程语言不同,如下所示:
var objects = [1, "Joe", true, null];
可以调用 Array.isArray() 来判断一个对象是否是数组,如下所示:
var numbers = 3;
var arr = [7,4,1776];
print(Array.isArray(numbers)); // 显示 false
print(Array.isArray(arr)); // 显示 true
3. 读写数组
在一条赋值语句中,可以使用 [] 操作符将数据赋给数组,比如下面的循环,将 1~100 的
数字赋给一个数组:
var nums = []; for(vari=0;i<100;++i){ nums[i] = i+1; }
还可以使用 [] 操作符读取数组中的元素,如下所示:
var numbers = [1,2,3,4,5];
var sum = numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4];
print(sum); // 显示 15
如果要依次读取数组中的所有元素,使用 for 循环无疑会更简单:
var numbers = [1,2,3,5,8,13,21]; var sum=0; for (var i = 0; i < numbers.length; ++i) { sum += numbers[i]; } print(sum); // 显示 53
注意,这里使用数组的 length 属性来控制循环次数,而不是直接使用数字。JavaScript 中 的数组也是对象,数组的长度可以任意增长,超出其创建时指定的长度。length 属性反映 的是当前数组中元素的个数,使用它,可以确保循环遍历了数组中的所有元素。
4. 由字符串生成数组
调用字符串对象的 split() 方法也可以生成数组:
var sentence = "the quick brown fox jumped over the lazy dog"; var words = sentence.split(" "); for (var i = 0; i < words.length; ++i) { print("word " + i + ": " + words[i]); } //该程序的输出为: word 0: the word 1: quick word 2: brown word 3: fox word 4: jumped word 5: over word 6: the word 7: lazy word 8: dog
5. 浅复制和深复制
浅复制:当把一个数组赋给另外一个数组时,只是为被赋值的数组增加了一个新的引用。当 你通过原引用修改了数组的值,另外一个引用也会感知到这个变化。
var nums = []; for(vari=0;i<100;++i){ nums[i] = i+1; } var samenums = nums; nums[0] = 400; print(samenums[0]); // 显示 400
深复制,将 原数组中的每一个元素都复制一份到新数组中。可以写一个深复制函数来做这件事:
function copy(arr1, arr2) { for (var i = 0; i < arr1.length; ++i) { arr2[i] = arr1[i]; } }
6. 存取函数
JavaScript 提供了一组用来访问数组元素的函数,叫做存取函数,这些函数返回目标数组
的某种变体。
7. 查找数组元素 indexOf()
indexOf() 函数是最常用的存取函数之一,用来查找传进来的参数在目标数组中是否存在。 如果目标数组包含该参数,就返回该元素在数组中的索引;如果不包含,就返回 -1。
var names = ["David", "Cynthia", "Raymond", "Clayton", "Jennifer"]; var name = "Cynthia"; var position = names.indexOf(name); console.log(position);
8. 数组转字符串 join() toString()
var names = ["David", "Cynthia", "Raymond", "Clayton", "Mike", "Jennifer"]; var namestr = names.join(); console.log(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer namestr = names.toString(); console.log(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer
9. 组合截取字符串 concat() splice()
concat() 和 splice() 方法允许通过已有数组创建新数组。concat 方法可以合并多个数组
创建一个新数组,splice() 方法截取一个数组的子集创建一个新数组。
var cisDept = ["Mike", "Clayton", "Terrill", "Danny", "Jennifer"]; var dmpDept = ["Raymond", "Cynthia", "Bryan"]; var itDiv = cis.concat(dmp); console.log(itDiv); itDiv = dmp.concat(cisDept); console.log(itDiv); //输出为: Mike,Clayton,Terrill,Danny,Jennifer,Raymond,Cynthia,Bryan Raymond,Cynthia,Bryan,Mike,Clayton,Terrill,Danny,Jennifer
splice() 方法从现有数组里截取一个新数组。该方法的第一个参数是截取的起始索引,第 二个参数是截取的长度。下面的程序展示了 splice() 方法的工作原理:
var itDiv = ["Mike","Clayton","Terrill","Raymond","Cynthia","Danny","Jennifer"]; var dmpDept = itDiv.splice(3,3); var cisDept = itDiv; print(dmpDept); // Raymond,Cynthia,Danny print(cisDept); // Mike,Clayton,Terrill,Jennifer
《数据结构与算法JavaScript描述》第二章