Почему приведение Object (null) не равно null? - PullRequest
3 голосов
/ 06 марта 2012

Когда вы приводите null к объекту с помощью Object(null), результатом является объект.

Когда вы приводите undefined к объекту, используя Object(undefined), результатом является объект.

Но высказывание null as Object или undefined as Object остается нулевым.

Почему это? Я не могу найти ничего в документации об этом.

Объекты, полученные в результате этих приведений, могут иметь свойства, установленные и считанные с них. Это как если бы актер создал информацию или удалил любую специальную информацию, которую имеют значения null и undefined. Но в документации AS3 нет никаких указаний на то, что специальные типы null и undefined на самом деле являются объектами.

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Сначала легче объяснить с помощью 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;

Здесь ссылка s типа String указывает на значение null типа Null.

Ссылка String, значение Null.

A 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) только тогда, когда вы хотите преобразовать значение одного типа в значение другого типа.

3 голосов
/ 06 марта 2012

Существует разница между двумя техниками каста. Вот хорошее прочтение: http://upshots.org/actionscript-3/as3-casting-objects

По сути, Object (null) фактически преобразует null в Object, в то время как «as» пытается определить, можно ли считать null объектом, а это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...