Object的键名可以为未定义变量?

首先看下面的错误代码:

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

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

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

1_currentInfoQueue = _fightInfoQueue.GLOBAL_INFO;

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

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

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

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

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

执行后的效果:

BLUE:255 RED:16711680 GREEN:65280

16711680 255 65280

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

不知是不是AS的BUG。