Array(*) Cast还是创建?Array(*) Cast or Construct?

Search_01 在ActionScript有两种type cast: var c1:ArrayCollection = c as ArrayCollection; var c2:ArrayCollection = ArrayCollection(c); 前者中c可以为null, 而后者要求c不可为null,否则throw Error.

如下代码:

var obj:Object = [1, 2, 3];
trace(Array(obj).length);

运行后输出代码为3还是1?

答案是1. Array(*)永远是创建一个新Array而不是进行cast,所以Array(obj)就是:一个只含有一个元素的Array,而这个元素本身是一个含有三个元素的Array.

同样的String(*)永远是创建一个新的String而不是进行cast, 所以String(null)返回是“null”String而不是throw Error.

看上去这些貌似是特例,而背后真正的原因是function的precedence要高于type cast - precedence即优先序,如乘除的优先序比加减高;Array(), Boolean(), int(), Number(), String(), Vector(), XML(), XMLList()等都是在top level package定义的function, 所以类似Array(*)这些就不是type cast了而是function call了.