【问题标题】:Why is casting Object(null) not null?为什么强制转换 Object(null) 不为 null?
【发布时间】:2012-03-06 17:58:13
【问题描述】:

当您使用 Object(null) 将 null 强制转换为对象时,结果是一个对象。

当您使用 Object(undefined) 将 undefined 强制转换为对象时,结果是一个对象。

但是说null as Objectundefined as Object 仍然为空。

这是为什么?我在文档中找不到任何关于此的内容。

这些转换产生的对象可以设置属性并从中读取。就好像演员创建了信息,或者删除了 nullundefined 值具有的任何特殊信息。但在 AS3 文档中没有表明 nullundefined 特殊类型实际上是对象。

【问题讨论】:

  • 简单的答案?因为它是flash,而且flash是坏的。编写带有尾括号的类型是声明一个新对象,并且您将 null 作为构造函数参数传递给复制或重新解释类型转换。它本质上与 var o = new Object(null); 相同。您仍在创建对象。
  • 你说对了一半,@AscensionSystems。您正在创建一个对象,但它与调用new Object() 不同,即使结果相同。最重要的是要理解Object( something ) 根本不是类型转换:它调用名为Object 的顶级函数,它试图返回Object 值 的东西。而且,事实证明,null 的 Object 值是一个空 Object。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
  • 您需要了解 null 和 undefined 实际上是什么。 Null 是指已声明变量但没有任何值的情况。如果一个变量没有被声明,那么它是未定义的并且会出现编译器错误。跟踪(空 == 未定义); //输出true和trace(null === undefined); //输出错误
  • 有趣的 nfo 伙计们,我回家后会检查一下。 Flash确实是一种奇怪的动物。
  • weltraumpirat — 为什么null 的对象值是一个空对象?从您引用的页面中:“ActionScript 3.0 中的每个值都是一个对象,这意味着对一个值调用 Object() 会返回该值。”这似乎与本次讨论中迄今为止给出的所有解释相矛盾,而不是强化。

标签: actionscript-3 actionscript


【解决方案1】:

两种铸造技术之间存在差异。这是一个很好的阅读:http://upshots.org/actionscript-3/as3-casting-objects

基本上,Object(null) 实际上将 null 转换为 Object,而“as”试图查看 null 是否可以被视为 Object,但它不能。

【讨论】:

  • 根据 [1] 和关于 null 和 undefined 类型的文档,null 是 Object 类型变量的有效值,而 undefined 不是。所以 Object(undefined) 起作用的原因可能是 undefined 被隐式强制为 null。但是为什么 Object(null) 转换成功地将空值转换为标准对象实例?我希望它给出另一个空值、空引用或某种转换错误。 [1]help.adobe.com/en_US/as3/learn/…
  • 我同意你回答的结尾部分。 AS 关键字调用 RTTI 来查看被转换的对象是否与所需的转换类型共享一个继承链,并在可能的情况下执行转换。我不同意 VM 将 NULL 转换为对象的部分。 VM 简单地分配一个新的对象并假设 NULL 或 0 参数来构造对象。与未定义相同。
【解决方案2】:

先用String 更容易解释。

假设我们这样做:

var v:* = null;
var s:String = v;

会发生什么? s 变为 nullnullString 类型引用的有效值。

现在改为:

var v:* = null;
var s:String = String(v);

现在会发生什么? s 变为 "null"。我们在这里明确要求String 类型的对象,但nullNull 类型,因此必须对其进行转换。 null 转换为String"null"

如果您要将123.45 转换为String,您将得到"123.45"。很公平。

现在让我们试试Object

var v:* = null;
var obj:Object = v;

obj 变为 null

现在:

var v:* = null;
var obj:Object = Object(v);

这里我们再次明确要求obj 指向Object 类型的值——null 不是。 null 转换为 Object 是一个空对象。

让我们再看看:

var s:String = null;

这里String 类型的引用s 指向Null 类型的值null

引用String,值Null

String 引用可以采用Null 值,但Number 引用不能采用Null 值,因此在将null 分配给Number 时,它必须进行转换(即转换为@987654364 @)。

var n:Number = Number(null); // 0

从参考和价值观的角度思考确实很有帮助。

记住转换是为了参考,转换是为了价值Object(value) 是一种转换。 (value as Object) 是演员。

最后,让我们尝试使用用户定义的类型。

class Person {}

然后:

var person:Person = null;

这里person 变成null,正如你所期望的那样。

但是:

var person:Person = Person(null);

person 又变成了null!我们要求Person,但我们得到了Null。怎么会?

null 无法转换为类型Person。在这种情况下,结果是所需类型的默认值。 Person 的默认值为 null

你也可以看到这个转换为Number

var n:Number = Number("123.45");

n 变为 123.45

var n:Number = Number("The quick brown fox, period.");

n 变为 NaN

由于字符串"The quick brown fox, period."无法转换为Number类型,所以结果为Number的默认值,即NaN。这与前面的示例形成对比,我们成功地将null 转换为Number,产生0

我可以继续。

如有疑问,请使用as 运算符。 value as Type 基本上等于value is Type ? value : null。无需记住复杂的规则。仅当您要将一种类型的值转换为另一种类型的值时,才使用Type(value)

【讨论】:

  • 从您的回答中引用几句:“null 转换为 Object 是一个空对象”,以及:“值 null 不能转换为 Person 类型。在这种情况下,结果是默认值为所需的类型。Person 的默认值为 null。”我似乎无法将这两个陈述背后的逻辑结合成一个连贯的理解。我明白为什么将 null 转换为另一种类型(如您的 Person 示例)仍然为 null,而不是类型的实例。这很有意义。但是为什么将 null 转换为 Object 有什么不同呢?
  • 进一步,来自文档:“在 ActionScript 3.0 中,Object 类实例的默认值为 null”,来自 [1],并且:“ActionScript 3.0 中的每个值都是一个对象,其中表示对一个值调用 Object() 会返回该值”,来自 [2]。 [1]help.adobe.com/en_US/as3/learn/… [2]help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
  • @spiralganglion 这不是“铸造”,而是转换。考虑:Type(value)。步骤:(1)尝试将value转换为Type; (2) 如果失败,使用默认值。在Object(null) 第一步成功!在Person(null) 中它失败了。 Object 的默认值是null,但是转换成功后,就不需要默认值了。
  • @spiralganglion null 不能转换为 Person 值,但可以分配给 Person 引用。另一方面,null 可以转换为 Object 值(结果:空对象)。
  • 为什么将null 值转换为Object 类型会成功?为什么成功会导致创建一个空对象?您能指出文档中支持这一点的任何内容吗?
猜你喜欢
  • 2011-09-14
  • 2023-02-12
  • 1970-01-01
  • 2022-01-13
  • 2023-03-24
  • 1970-01-01
  • 2020-04-27
  • 2018-02-10
  • 1970-01-01
相关资源
最近更新 更多