数组是元素的一个有序组合。在JavaScript中,数组可以使用正式的对象表示法来创建,或者可以使用直接量表示法来初始化。 复制代码 代码如下: var arrObject = new Array("val1", "val2"); // 作为对象的数组 var arrLiteral = ["val1", "val2"]; // 数组直接量
对于开发者来说,这没有区别:在直接量和对象上都可以调用一个Array方法。对于JavaScript引擎来说,每次访问数组直接量的时候,必须重新解释它,特别是在一个函数中使用它的时候。 使用new运算符来创建一个新的Array对象: 复制代码 代码如下: var arrObject = new Array();
也可以创建带有某些值的一个新数组: 复制代码 代码如下: var arrObject = new Array("val1", "val2");
JavaScript中的数组是从0开始索引的,这意味着,第一个元素的索引是0,最后一个元素是数组的长度减去1。 1、循环遍历数组 问题:想要很容易地访问数组的所有元素。 解决方案: 要访问一个数组,最常用的方法是使用for循环: 复制代码 代码如下: <script type="text/javascript"> var animals = new Array("cat", "dog", "whale", "seal"); var animalString = ""; for (var i = 0; i < animals.length - 1; i++) { animalString += animals[i] + " "; } alert(animalString); </script>
讨论: forEach方法接受一个参数,这个参数是个函数。该函数自身有3个参数:数组元素,元素的索引和数组。 参见: 大多数浏览器都支持forEach。然而,对于那些不支持的浏览器,可以使用Array.prototype属性来模拟forEach行为。 复制代码 代码如下: <script type="text/javascript"> if (!Array.prototype.forEach) { Array.prototype.forEach = function (fun/*, thisp*/) { var len = this.length >>> 0; if (typeof fun != "function") { throw new TypeError(); } var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in this) { fun.call(thisp, this[i], i, this); } } }; } </script>
6、创建一个过滤后的数组 问题:想要过滤一个数组中的元素的值,并且把结果赋给一个新的数组。 解决方案: 使用Array对象的filter方法: 复制代码 代码如下: <script type="text/javascript"> function removeChars(element, index, array) { return element !== "**"; } var charSets = new Array("**", "bb", "cd", "**", "cc", "**", "dd", "**"); var newArray = charSets.filter(removeChars); alert(newArray); // bb,cd,cc,dd </script>
讨论: filter方法是ECMAScript 5新添加的方法,该方法将一个回调函数应用于每一个数组元素。作为参数传递给filter方法的函数返回一个布尔值,true或false,根据测试数组元素的结果来返回。这个返回值决定了该数组元素是否添加到一个新的数组中,如果函数返回true,将会添加;否则,将不会添加。 参见: 对于不支持filter方法的浏览器的模拟实现: 复制代码 代码如下: <script type="text/javascript"> if (!Array.prototype.filter) { Array.prototype.filter = function (fun/*, thisp*/) { var len = this.length >>> 0; if (typeof fun != "function") { throw new TypeError(); } var res = new Array(); var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in this) { var val = this[i]; // 放置fun修改了this if (fun.call(thisp, val, i, this)) { res.push(val); } } } return res; }; } </script>
7、验证数组内容 问题:想要确保一个数组满足某个条件。 解决方案: 使用Array对象的every方法来检查给定条件的每个元素。 复制代码 代码如下: <script type="text/javascript"> function testValue(element, index, array) { var re = /^[a-zA-Z]+$/; return re.test(element); } var elemSet = new Array("**", 123, "abc", "-", "AAA"); alert(elemSet.every(testValue)); </script>
讨论: Array对象的every和some方法都是最新的ECMAScript 5 Array方法,不同之处在于当使用every方法的时候,只要该函数返回一个false值,处理就会结束,并且该方法返回false。而some方法将继续测试每一个数组元素,知道回调函数返回true。此时不再验证其他的元素,该方法返回true。如果回调函数测试了所有的元素,并且任何时候不会返回true,some方法返回false。 参见: 对于不支持every和some的浏览器的实现方式: 复制代码 代码如下: <script type="text/javascript"> if (!Array.prototype.some) { Array.prototype.some = function (fun/*, thisp*/) { var i = 0, len = this.length >>> 0; if (typeof fun != "function") { throw new TypeError(); } var thisp = arguments[1]; for (; i < len; i++) { if (i in this && fun.call(thisp, val, i, this)) { return true } } return false; }; } if (!Array.prototype.every) { Array.prototype.every = function (fun/*, thisp*/) { var len = this.length >>> 0; if (typeof fun != "function") { throw new TypeError(); } var thisp = arguments[1]; for (var i=0; i < len; i++) { if (i in this && fun.call(thisp, val, i, this)) { return false } } return true; }; } </script>