首先看下面的错误代码:

1
2
3
public static const GLOBAL_INFO:String = 'global';
_fightInfoQueue = {GLOBAL_INFO:[]};
_currentInfoQueue = _fightInfoQueue[GLOBAL_INFO];

执行这段代码,_currentInfoQueue 的值应该会是一个数组么?不是,是 null

通过调试器,可以看到 _fightInfoQueue 中的这个唯一的元素的键名是字符串 GLOBAL_INFO ,不是我认为的 global 。如果希望上面的 _currentInfoQueue 得到正确的值,必须使用下面的语法:

1
_currentInfoQueue = _fightInfoQueue.GLOBAL_INFO;

或者在定义的时候,使用下面的语法:

1
_fightInfoQueue = {"global":[]};

那么究竟是怎么回事呢?我又做了个测试:

1
2
3
4
5
6
7
8
9
var colors:Object = {RED:0xFF0000, GREEN:0x00FF00, BLUE:0x0000FF};
for(var i:String in colors)
{
trace(i + ':' + colors[i]);
}
trace('===============');
trace(colors.RED);
trace(colors.BLUE);
trace(colors.GREEN);

在上面的代码中,RED、GREEN、BLUE都是没有定义的变量。

执行后的效果:

BLUE:255
RED:16711680

GREEN:65280

16711680
255
65280

也就是说,如果使用没有定义的变量作为Object的键名,那么AS会自动将这个变量转换成为字符串。同时,也可以使用这个未定义的名称来引用Object中的值。

不知是不是AS的BUG。

留言

2010-12-06
次访问