在ActionScript中如何测试对象是否已定义

28
在 ActionScript 中,如何测试一个对象是否被定义,也就是不是 null?

1
在AS1、AS2和AS3中,这是否完全相同? - bzlm
4个回答

35

测试对象是否已定义

此方法适用于AS2和AS3,并且是测试对象是否具有值的最可靠方式。

if (obj != null) {
    doSomethingWith(obj);
}

这也是测试对象属性并在同一表达式中读取它的最可靠方法:

if (arr[0] != null && arr[0]>5) {
    doSomethingWith(arr[0]);
}

测试对象是否为空

null 和 undefined 是不同的,但如果您不关心它们之间的区别,可以使用普通的比较运算符进行比较,因为它们相等:

if (obj == null) {
    doSomethingWith(obj);
}

等同于

if (obj == undefined) {
    doSomethingWith(obj);
}

如果你在意差异,请使用 === 或 !== 操作符,它们不会进行类型转换。

if (obj === undefined) {
    // obj was never assigned a value
}
else if (obj === null) {
    // obj was explicitly set to null
}
else {
    doSomethingWith(obj);
}

1
你的意思是我代码库中所有的 if(obj == null || obj == undefined) 语句都可以简化?太棒了! :) - Herms
你能在那里加入 "if (obj)" 吗?布尔强制转换是如何工作的? - bzlm
这可能已经过时了,但我通过搜索ActionScript检查null而找到了这个页面。我有一个mx:html控件,在htmlDOMInitialize中,我这样获取文档:doc:Object = myMxHTML.domWindow.document;然后,即使trace(doc.head)显示为null,doc.head==null的结果为false。根据文档,doc不是null。 - HMR
@HMR 你可能想要提出一个关于你特定情况的新问题。听起来有一些不寻常的事情正在发生,但我对 ActionScript 的了解还不够,无法确定具体是什么。 - Matthew Crumley
嗨,马修,我也不知道应该发生什么。只是在搜索检查null时,这个页面排名第二,所以我想确保这仍然是当前的。没有做太多测试,但追踪notNullVar.nullOrNotExisting给了我null,其中notNullVar.nullOrNotExisting == null等于false。可以问一个新问题,但我打赌很多人在谷歌搜索时会来到这里,如果这里的答案不起作用,他们可能会感到失望。 - HMR
据我所知,@HMR,它仍然是当前的。至少对于ECMAScript来说是这样的(但我不知道ActionScript有多么紧密地遵循规范)。然而,宿主对象(如DOM)并没有被语言规定,因此它们通常可以按照自己的方式行事,这可能解释了您看到的不一致性。 - Matthew Crumley

8

如果你只想测试一个泛型的“无”,那么对于ActionScript 3.0来说,这非常容易:

var a;
var b;
var c;
var d;
a = undefined;
b = null;
c = 5;
if (a) 
    trace(a);
if (b) 
    trace(b);
if (c) // Will trace
    trace(c); 
if (d) 
    trace(d);

在上面的示例中,只有c将被跟踪。这通常是我所需要的,只需检查if (obj)即可获得最易读的版本。
该方法使用隐式转换为布尔值,也称为布尔强制转换,关于哪些值将被转换为false以及哪些值将被转换为true 请参考ECMA标准,并且还专门为ActionScript记录

我本以为我会尝试那个,但这确实有效,并且我觉得它看起来也很好。 - Matthew Shanley
我也喜欢它,它使代码更易读,重构更容易。 - bzlm
2
注意,e = 0; if (e) trace(e); - cHao
哎呀!这段代码可以写得更加简洁var a = undefined, b = null, c = 5, d; - Cilan
3
@TheWobbuffet 为什么止步于此呢?这段代码可以被简化为只包含trace(5)。但是这样做以及你的建议,都会违背这段代码的目的,即尽可能清晰地说明布尔强制转换的工作原理。 :) - bzlm

3

只需将其与null进行测试即可。

var someObj:Object = getSomeObjectOrMaybeNull();
if(someObj == null) {
  trace("someObj is null!");
} else {
  trace("someObj is not null!");
}

-2

你也可以循环遍历父对象,查看它是否包含你要查找的对象的任何实例。

foundit=false;
for (var i in this) {
    if (this[i]._name == "MyMovie") {
         foundit=true;
    }
}

循环仅仅为了查找某个对象是否为空是非常糟糕的做法。 - David Salzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接