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

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:Object的键名可以为未定义变量?
  • 本文链接:http://zengrong.net/post/1195.htm

首先看下面的错误代码:

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

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

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

_currentInfoQueue = _fightInfoQueue.GLOBAL_INFO;

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

_fightInfoQueue = {"global":[]};

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

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。