动作脚本3 |对象或数组

ActionScript3 | Object or Array

对象和数组有什么区别?什么时候用数组,什么时候用对象?

请举例说明 - 如何正确使用它们。

数组用于数字访问,并且是从零开始的(0 是第一个元素)

var array:Array = new Array("a", "b", "c");
array[0] = "z";  // change first element to z
array.push("d"); // add d to end

trace(array[3]) // output: d
trace(array)    // output: z,b,c,d

数组可以循环

for (var i:int = 0; i < array.length; i++) 
{ 
    trace(array[i]); 
}

对象可用于多种用途。与 Array 相比,它可以允许关联数组(使用字符串作为键而不是整数)

var assocArray:Object = {me:"Mike", you:"Gabriel"};

// property-style access
trace( assocArray.me ) // output Mike

// access with string
trace( assocArray["you"] ) // Gabriel

Objects

当我们在 ActionScript 3 中谈论 Object 时,重要的是要注意 所有内容 继承 Object 并且香草 Object 实例是 dynamic(这意味着您可以自由地将数据附加到它,而无需在 class 定义中定义该数据)。

您可以使用 new Object(){ } 对象字面量语法来初始化原始对象。

动态对象是一个 key:value 存储,这意味着它根据字符串存储值,这些值可用于以后引用值。可以使用点表示法 (object.key) 或方括号表示法 (object['key']) 以这种方式设置或检索值。两者之间的主要区别在于使用方括号表示法,您可以:

  • 使用动态键获取或设置值(例如,在构建字符串、解析列出属性的文件等之后
  • 具有包含空格等非法字符的密钥。

所有这些的完整示例如下:

var data:Object = { };

data.firstName = 'John';
data['lastName'] = 'Smith';

trace(data['firstName'] + ' ' + data.lastName); // John Smith

对象字面量语法也可以接受 key:value 对,这意味着上面的内容可以简化为:

var data:Object = { firstName: 'John', lastName: 'Smith' };

迭代 key:value 存储的 Object 是使用 for..in 循环实现的:

for(var prop:String in data)
{
    trace(prop, data[prop]);
}

Arrays

注意,根据上面,我们知道Array直接继承了ObjectArray class 也是 dynamic,这意味着您可以使用与上述 Object 相同的 key:value 存储。这是它开始变得混乱的地方。

可以使用以下方式初始化数组:

  • new Array()
  • [] 数组文字语法。
  • 顶级Array()函数。

数组能够存储顺序数据与任意值集合。虽然我们添加到上面的 data 对象的值看起来是顺序的,但它们实际上是以 无特定顺序存储的 .

数组使用从零开始的数字索引代替 'keys' 来存储顺序数据,像这样:

var array:Array = [];
array[0] = 'hello';

trace(array[0]); // hello

数组提供了处理数组头部和尾部添加和删除元素的方法,如push()pop()shift()unshift()。数组也可以提供它们的 length,表示该数组中元素的数量。

当您开始对数组使用非数字键时会出现混淆:

array['prop'] = 10;

我们实际上没有向顺序列表中添加元素,而是返回到数组继承的 Object,添加一个任意 prop 键,值为 10。在这种情况下,我们在数组(字符串hello)中有一个,以及一个名为属性的动态prop 附加到数组实例本身(不在数组中)。

要迭代项目数组,我们可以使用普通的 for 循环或 for each 循环:

for(var index:int = 0; i < array.length; i++)
{
    trace(array[index]);
}

// Or:

for each(var value:String in array)
{
    trace(value);
}

重要的是要注意 for each 循环仅在数组中的所有值都与该循环定义中使用的类型相同时才有效(在本例中为 String) .

Vectors

向量是一种专门的顺序数据存储,通过预先定义要存储的对象类型,您可以从静态类型检查中获益。例如,我们可以使用以下语法创建 Sprite 个对象的列表:

var sprites:Vector.<Sprite> = new <Sprite>[];

因为 Vectors 是有类型的,所以向列表中添加一个非 Sprite 值会给你一个编译时错误,从而避免了很多潜在的错误。向量还提供比数组更快的读写访问。