添加删除元素:
查找:indexOf、lastIndexOf,查找的条件是全等匹配,也就是说不会进行类型转换
在数组首尾新增元素:push、unshift
push方法:在数组尾部新增一个或多个元素。
unshift 方法:在数组头部新增一个或多个元素
push和unshift 方法都有返回值。返回值是增加元素后的数组长度。
删除数组首尾元素:pop、shift
pop 方法用于将数组最后一个元素删除。
shift方法用于将数组第一个元素删除,剩余元素索引值自动减1。
pop 和shift 都有返回值。返回值就是那个被删除的元素。
splice和slice
splice 删除数组一段连续的元素,返回被删除的元素数组;
另外要记住,splice改变了原数组的内容。如果只是想得到数组中的一段内容而不想改变原数组,那么应该使用slice方法。Slice方法不改变原数组内容。
slice 获取数组中的部分元素;
有两个参数:一个是截取范围的起点索引,另一个是截取范围的终点索引。slice 的起点和终点索引值都可以是负值。
如果输入时,不慎将输入的起点索引设置为大于终点索引值,那么slice只会返回一个空数组。
当不传任何参数给slice方法时,将生成原数组的一个浅复制。
排序:revese、sort、sortOn
Revese 方法能将数组元素倒序,返回值是新的数组。
Sort 方法是对数组元素排序。有3 种使用方式,如下。
数组.sort(); //默认排序
数组.sort(排序方式);//使用“排序方式”参数来排序,排序方式是一些定义好的整数常量
数组.sort(比较函数);//使用自定义的比较函数,注意此处只写函数名即可
当数组原算是复杂数据类型,且需要根据这种对象的某个属性值来排序时,就需要用到sortOn 方法了。
排序方式,一共有5 种,如下。
Array.CASEINSESITIVES 值为:1,表示大小写不敏感按字母顺序排序,如果是数字则从小到大
Array.DESCENDING 值为:2,表示按字母倒序排列
Array.UNIQUESORT 值为:4,表示必须是唯一性排序,如果比较值结果相同,则放弃排序
Array.RETURNINDEXEDARRAY 值为:8,让sort()和sortOn()函数返回值排序后的索引列表,同时保持原数组不变
Array.NUMERIC or16 值为:16,强制sort()和sortOn()中对数值采用从小到大排序,否则,不设方式,sort()和sortOn()将把数字当成字符串来排序
排序方式可以同时用多个,使用“|”号隔开。
操作数组每个元素;forEach、every、filter、map、some
在ActionScript3中为什么没有StringBuilder类呢?其实在ActionScript3的设计过程中,曾经有过StringBuilder类。但后来,ActionScript3对加法运算符(+)做了修改,使得它在实现复杂字符串(CompoundString)时效率非常高,从而StringBuilder类没有必要再加进去了。底层原理是因为ActionScript3中的复杂字符串实现是一种绳状结构,当“+”时,只是把现有的String 对象链接到原有对象后面,不需要频繁生成新的不变对象。
substring()和slice()也有一些小区别。
substing()的起点和终点不可以为负数,即使用了负数,也会被当成0 来处理。slice()的起点和终点不仅可以写正整数,也可以写负数。
数组.concat(参数1,参数,参数3…参数n)
concat 可将多个元素或数组拼成一个新的数组,并通过返回值返回,不改变原有数组内容:用法格式如下。参数可以是一个也可以是多个。不传任何参数给concat 方法时,将生成原数组的一个浅复制。
concat和push的不同点是:
● concat 不改变原有数组内容,而是生成一个新数组返回。push 直接改变原数组内容。
● 当参数是数组时,concat 和push 的行为不同。concat会将数组分开成各个元素按顺序加入,而push则把这个是数组的参数当成一个元素加入原数组后面。
浅复制、深复制
何时用浅复制?何时用深复制?
当数组元素全部是基元数据类型(primitive data type)时,即全部是值类型时,复制是没有浅复制和深复制的分别的。若需要复制,使用下文中的浅复制方法即可。
但是当数组元素全是复杂数据类型(complex data type),即引用类型时,那么复制就会有两种选择:一种是浅复制,一种是深复制。
当数组部分元素是基元数据,部分元素是复杂类型数据时,也要考虑该采取哪种复制方式:由于ActionScript3 数组不是类型化数组,允许存储不同类型的数据,因此这种情况也是很常见的。对于基元数据类型的元素,不论用哪种方式复制,执行效果都一样。只有对于复杂数据类型的元素,才有深复制和浅复制的区别。
因为对Array这个引用类型,“==”判断的是变量持有对象的引用是否相同,而不是内容相同
使用深复制生成的新数组,其所有元素都是真正的原数组元素的备份。这时两个数组中相同位置的元素,存放的是不同的引用,指向不同的对象。但是这两个对象的状态是完全一致的。
如果生成深复制?这就需要使用到强大的ByteArray 类了。方法见示例
var objectElement:Object = {name:"kingda", web:"www.kingda.org"};
var arrayElement:Array = [1,2,3];
var foo:Array = ["a string element", arrayElement, objectElement];
//以下4 行深复制数组foo
var fooBA:ByteArray = new ByteArray();
fooBA.writeObject(foo);
fooBA.position = 0;
var bar:Array = fooBA.readObject() as Array;
trace (bar);
//输出:a string element,1,2,3,[object Object]