AS3学习笔记(二)Array数组操作

添加删除元素:

查找: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]

 

转载于:https://my.oschina.net/shajin/blog/817330

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值