为什么铸造Object(null)不为null?
当您使用Object(null)
将null转换为对象时,结果是一个对象。为什么铸造Object(null)不为null?
当您使用Object(undefined)
将未定义的对象转换为对象时,结果为对象。
但是说null as Object
或undefined as Object
仍然为空。
这是为什么?我在文档中找不到任何关于此的内容。
由这些转换产生的对象可以在它们上设置和读取属性。就好像演员创建了信息,或者删除了值为null
和undefined
的任何特殊信息。但在AS3文档中没有迹象表明null
和undefined
特殊类型实际上是对象。
这两种铸造技术是有区别的。这里有一个很好的阅读:http://upshots.org/actionscript-3/as3-casting-objects
基本上,Object(null)实际上将null转换为Object,而“as”试图查看null是否可以被当作Object,而不能。
根据[1]和有关空和未定义类型的文档,null是Object类型变量的有效值,而undefined不是。所以Object(未定义)工作的原因可能是undefined被隐式强制转换为null。但是为什么Object(null)强制转换成空值到标准对象实例?我期望它可以给出另一个空值,空引用或某种转换错误。 [1] http://help.adobe.com/en_US/as3/learn/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9c.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7fda – ivanreese 2012-03-06 18:24:27
我同意你答案的结尾部分。 AS关键字调用RTTI来查看正在被投射的对象是否与所需的投射类型共享继承链并且如果可能的话执行投射。我不同意VM将NULL转换为对象的部分。虚拟机只是分配一个新的对象,并假定为NULL或0参数来构造对象。与undefined一样。 – 2012-03-06 19:18:04
首先用String
解释更容易。
比方说,我们这样做:
var v:* = null;
var s:String = v;
会发生什么? s
变成null
。 null
对于类型String
的引用是有效的值。
现在改为:
var v:* = null;
var s:String = String(v);
现在会发生什么? s
变成"null"
。我们明确要求在此处输入String
的对象,但null
的类型为Null
,因此必须进行转换。 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
时必须将其转换(即,0
)。
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,而不是类型的实例。这很有道理。但是为什么将Object null投射到任何不同? – ivanreese 2012-03-08 00:48:27
此外,从文档:“在ActionScript 3.0中,Object类的实例的默认值为null”,来自[1]和:“ActionScript 3.0中的每个值都是一个对象,这意味着调用Object一个值返回该值“,来自[2]。 [1] http://help.adobe.com/en_US/as3/learn/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9c.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7fda [2] http://help.adobe.com/en_US/FlashPlatform/reference /actionscript/3/package.html#Object() – ivanreese 2012-03-08 00:57:41
@spiralganglion它不是“铸造”,而是转换。考虑:“类型(值)”。步骤:(1)尝试将'value'转换为'Type'; (2)如果失败,使用默认值。在'Object(null)'步骤1成功!在'人(空)'它失败。 Object的默认值为null,但转换成功后,不需要默认值。 – Manish 2012-03-08 03:03:49
简单的答案?因为它是闪光灯,闪光灯不好。用尾括号写一个类型是声明一个新对象,并且你传递null作为构造函数参数用于复制或重新解释类型转换。它基本上与说var o = new Object(null);相同。你仍然在创建一个对象。 – 2012-03-06 19:12:49
@AscensionSystems,你是对的。您正在创建一个对象,但它与调用'new Object()'不同,即使结果相同。要理解的最重要的事情是:Object(something)根本不是类型转换:它调用称为Object的顶级函数*,它试图返回* Object值*。而事实证明,'null'的Object值是一个空的Object。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package.html#Object() – weltraumpirat 2012-03-06 19:33:38
您需要了解实际是null还是undefined。空是当一个变量已被声明但没有任何值。如果一个变量没有被声明,那么它是未定义的,并且会有编译器错误。 trace(null == undefined); //输出true和trace(null === undefined); //输出错误 – 2012-03-06 19:40:04