skip to main |skip to sidebar

2008-06-14

[AS3]E4X的变量展开详解(1)——基础

在 E4X 里可以使用 {} 来进行变量展开。比如下以下代码:

var foo:String = "123";
trace(<>abc{foo}def</>.toString());// -> abc123def

{} 里面可以为在执行期才知道的变量:

var foo:String = Math.random().toSTring();
trace(<>abc{foo}def</>.toString());

{} 还可以使用表达式(运算符、调用函数,etc.):

var foo:String = "123";
trace(<>{foo + foo}</>.toString());// -> 123123
//比较复杂一点的
trace(<>{foo += "456", foo+"789"}</>.toString());// -> 123456789
//调用函数
trace(<>{foo.substr(1)}</>.toString());// -> 23

{} 里无法使用语句,但可以使用匿名函数来代替:

var foo:String = "123";
trace(<>{(function(a){return a + a})(foo)}</>.toString());// -> 123123

使用 E4X 会减少一些代码,方便书写,但注意 <></> 的类型为 XMLList

最后给一个方便的函数:

public function e4xstr(e4x:XMLList):String {
  return e4x.toString();
}
//用法
var a:int = 3;
var b:int = 5;
trace(e4xstr(<>a+b={a+b}, a*b={a*b}</>)); // -> a+b=8, a*b=15

未完待续,下一篇详解 E4X 的内部实现

2008-06-07

[AS3]逻辑和(&&)与逻辑或(||)的妙用

使用 &&|| 可以简化代码,提高可读性。比如以下代码:

var foo:Boolean = true;
var bar:Object = {};
trace(foo && bar);  // -> [object Object]
trace(foo || bar);  // -> true

&&|| 的结果是由运算符的左边的项目(这里是 foo )来决定的。简单地说,规则为:

A && B : 如果 Boolean(A) 为 false 则返回 A,否则返回 B。
A || B : 如果 Boolean(A) 为 true 则返回 A,否则返回 B。

所以实际上并没有进行真正数学意义上的逻辑运算,返回值也不一定是 Boolean 值。

Boolean(A) 的转换规则如下:

Undefiend  : false
Null   : false
Boolean  : 与转换前相同
Number   : 0 或 NaN 为 false 替其他的为 true
String   : 空串为 false  其他的为 true
Object   : true

使用逻辑运算符简化代码

使用逻辑运算符可以简化简单的逻辑判断(if)。

//1. 使用 if
if (foo) {
  doSomething();
}
if (!bar) {
  doSomething2();
}

//2. 使用逻辑运算符
foo && doSomething();
bar || doSomething2();

多重 if 的写法:

//1. 使用 if
if (foo) {
  if (bar) {
    sayHello();
  }
}
 
//2. 使用 if 与逻辑运算符
if (foo && bar) {
  sayHello();
}

//3. 只使用逻辑运算符
foo && bar && sayHello();     

虽然 else 也可以实现,但代码有可能变得难一閲读。

&&= 与 ||=

在需要代入结果时,使用 &&=||= 更方便。

//1. 使用 if
if (foo) {
  foo =  "<" + foo + "/>";
}

//2. 使用逻辑运算
foo &&= "<" + foo + "/>";

2008-04-30

我的 Blog 的 Google PR 上升为 7!

在 2008-4 的 Google PR 的更新里我的 Blog 已经上升为7了。

在这里感谢大家对我的支持。

再请大家多多关注一下我的另一个 Blog —— ActionScript Snippets - 一个专门收集 AS 代码的 Blog,它的 PR 也上升为了3。

2008-04-27

[AS3]ActionScript 中数组的访问的 BUG

重要度:(3/5) 这个问题看似简单,但 debug 时却难以发现。

数组访问时如果下标使用了函数并且使用了 +=-=*= 等运算符时需要特别地注意,函数会被调用两次!

比如以下代码:

var i:int = 0;
var foo = function():int {
trace("foo");
return ++i;
}
var arr:Array = [1,2,3];
arr[foo()] += 10;
trace(arr);

将会输出:

foo;
foo;
1,13,3

而正确的输出为:

foo;
1,12,3

这是因为在编译时编译器只做了一下简单的操作:

(a += b) --> (a) = (a) + (b)

以至于将 arr[foo()] += 10; 编译成 arr[foo()] = arr[foo()] + 10;

2008-04-06

[AS3]mxmlc 编译器的 BUG

PS:因为最近很忙,好久没有更新 Blog 了。

最近发现了一个 mxmlc 编译器的 BUG,当含有 -(true ? 1 : 0) 的代码编译会出错。

比如以下代码:

package {
import flash.display.Sprite;
public class TestBUG extends Sprite {

public function TestBUG() {
trace('Test');
var foo:Number = -(true ? 1 : 0);
}
}
}

使用 mxmlc 编译时会弹出错误:

Error: null
java.lang.NullPointerException
  at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:1168)
  at macromedia.asc.parser.UnaryExpressionNode.evaluate(UnaryExpressionNode.java:33)
  at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:1805)
......

但把 -(true ? 1 : 0)- 号去掉后编译却可以正常进行,真奇怪!

影响的版本:

  • 2.0
  • 2.0.1
  • 3.0.0

2008-03-20

[Flash Player]2008年4月的 Flash Player 的安全策略的变化

在 Adobe 上公布了将在4月份改变 FLash Player 9 的安全策略。(Preparing for the Flash Player 9 April 2008 Security Update

这次的改变纯粹是为了安全,没有增加任何的新特性。但是默认的策略发生了一些改变,有可能会导致现有的一些程序无法正确地工作。

javascript 协议的改变

在以前,loadMovie() 里可以使用 javascript:... 的形式,但新的版本里只在 getURL()navigateToURL()ExternalInterface 里支持 JavaScript。

allowScriptAcces的变化

allowScriptAccess 是指定从 swf 访问 HTML 里的 Script 的方式的属性。以前的 Flash player 对于版本7以下的 swf 的 allowScriptAccess 属性的默认值为 always,版本8以上的默认值为 sameDomain

但新的版本对所有的版本的 swf 的默认值都将变为 sameDomain。版本7以下的 swf 必须明确地指定 allowScriptAccess = always

传送 HTTP Header 时的变化

使用 XML.addRequestHeader()LoadVars.addRequestHeader()URLRequest.requestHeaders 可以添加 HTTP 请求的 Header。在新的版本里向非同域名的服务器发送请求并添加 Header 时先必须要取得服务器的的许可。

具体的是需要在服务器上的 crossdomain.xml 添加添加以下项目:

<allow-http-request-headers-from domain="www.example.com" headers="HeaderName"/>

Socket 连接服务器时必须使用安全策略文件

XMLSocket 与 Socket 连接服务器的安全策略将会更严。新的版本在连接同域名时也需要使用安全策略文件,并且请求安全策略文件的端口固定为843。

2008-03-16

[AS3] ActionScript 3 的代码规范

Adobe 推出了AS3 的代码的书写规范。详情参见:Coding Conventions

它推出的代码规范并不意味着开发者必须严格地遵行,仅仅是建议罢了(开发 Flex SDK 的除外)

以下为我推荐的一些内容:

数组的声明格式

var a:Array /* of String */ = [];
var a:Array /* of int */ = [ 1, 2, 3 ];
function f(a:Array /* of Number */):Array /* of Object */  {
  //...
}

不要写成

var a:Array = [];
var a:Array = new Array();
var a:Array = new Array(1, 2, 3);
function f(a:Array):Array {
  //...
|

Object 的声明格式

var o:Object = {};
var o:Object = { a: 1, b: 2, c: 3 };

不要写成

var o:Object = new Object();
var o:Object = new Object();
o.a = 1;
o.b = 2;
o.c = 3

比较

if (n == 3) // "如果 n 是 3"

不要写成

if (3 == n) // "如果 3 是 n"