ActionScript: существует ли когда-нибудь серьезное основание использовать 'в качестве' кастинга?

Традиционный побег

Если вы используете XHTML, вам нужно использовать раздел CDATA. Вы также можете использовать их в HTML, но HTML не такой строгий.

Я разделил строковые константы, чтобы этот код работал внутри XHTML внутри блоков CDATA. Если вы используете свой JavaScript как отдельные файлы, вам не нужно беспокоиться об этом. Обратите внимание, что если вы используете XHTML со встроенным JavaScript, то вам нужно , чтобы заключить ваш код в блок CDATA, или что-то из этого не будет работать. Вы столкнетесь с странными, тонкими ошибками.

function htmlentities(text) {
    var escaped = text.replace(/\]\]>/g, ']]' + '>]]&gt;<' + '![CDATA[');
    return '<' + '![CDATA[' + escaped + ']]' + '>';
}

Текстовый узел DOM

«Правильный» способ экранирования текста - использовать функцию DOM document.createTextNode. Это на самом деле не экранирует текст; он просто говорит браузеру создать текстовый элемент, который по своей сути не разбирается. Однако вы должны быть готовы использовать DOM для того, чтобы этот метод работал: то есть у вас есть такие методы, как appendChild, в отличие от свойства innerHTML и аналогичных. Это заполнит элемент с идентификатором an-element текстом, который не будет анализироваться как (X) HTML:

var textNode = document.createTextNode("<strong>This won't be bold.  The tags " +
    "will be visible.</strong>");
document.getElementById('an-element').appendChild(textNode);

jQuery DOM Wrapper

jQuery предоставляет удобную оболочку для createTextNode по имени text. Это довольно удобно. Вот та же функциональность с использованием jQuery:

$('#an-element').text("<strong>This won't be bold.  The tags will be " +
    "visible.</strong>");
18
задан David Wolever 15 June 2009 в 14:38
поделиться

5 ответов

Вам необходимо использовать как , чтобы выполнить приведение в двух сценариях: приведение к дате и приведение к массиву .

Для дат вызов Date (xxx) ведет себя так же, как new Date (). ToString () .

Для массивов вызов Массив (xxx) создаст массив с одним элементом: xxx.

Метод преобразования Class () оказался быстрее, чем , поскольку , поэтому может быть предпочтительнее использовать как , когда эффективность имеет значение (и когда не работают с датами и массивами).

import flash.utils.*;

var d = Date( 1 );

trace( "'" + d, "'is type of: ",getQualifiedClassName( d ) );

var a:Array = Array( d );

trace( "'" + a, "' is type of: ", getQualifiedClassName( a ) );

    //OUTPUT
        //'Mon Jun 15 12:12:14 GMT-0400 2009 'is type of:  String
        //'Mon Jun 15 12:12:14 GMT-0400 2009 ' is type of:  Array

    //COMPILER ERRORS/WARNINGS:
        //Warning: 3575: Date(x) behaves the same as new Date().toString(). 
        //To cast a value to type Date use "x as Date" instead of Date(x).
        //Warning: 1112: Array(x) behaves the same as new Array(x).
        //To cast a value to type Array use the expression x as Array instead of Array(x).

`

12
ответ дан 30 November 2019 в 06:51
поделиться

Использовать "как" с массивами.

var badArray:Array;
badArray = Array(obj);

Будет получен массив длины, равный единице, с исходным массивом в первом элементе. Если вы используете «as» следующим образом, вы получите ожидаемый результат.

var goodArray:Array;
goodArray = obj as Array;

Как правило, «as» предпочтительнее «Class ()» в ActionScript, поскольку он ведет себя больше как приведение типов в других языках.

1
ответ дан 30 November 2019 в 06:51
поделиться

Я использую его, когда у меня есть коллекция объектов ArrayCollection и мне нужно перечислить их или использовать функцию выбора.

например

var abc: mytype = mycollection.getItemAt (i ) как mytype

0
ответ дан 30 November 2019 в 06:51
поделиться

В этом обсуждении стоит отметить несколько моментов.

Существует большая разница в том, как они работают, Class () будет пытаться привести объект к указанному Class, но в случае невыполнения этого (иногда, в зависимости от типа данных) выдается ошибка времени выполнения. С другой стороны, при использовании объекта в качестве класса сначала выполняется проверка типа, и если указанный объект не может быть приведен к указанному классу, вместо него возвращается значение NULL.

Это очень важное различие и полезный инструмент в развитие. Это позволяет нам делать следующее:

var o:MyClass = myArray[i] as MyClass;

if(o)
{
    //do stuff
}

Я думаю, что польза от этого очевидна.

«as» также более согласовано с остальной частью языка (например: «myObject is MyClass»).

Метод MyClass () имеет дополнительные преимущества при работе с простыми типами данных (int, Number, uint,

26
ответ дан 30 November 2019 в 06:51
поделиться

На самом деле они делают разные вещи ... когда вы говорите

myvar as ClassName

, вы просто даете компилятору знать, что этот объект является либо ClassName, либо подклассом ClassName

, когда вы говорите :

ClassName(myvar)

На самом деле он пытается преобразовать его в объект этого типа.

поэтому, если ваш объект является потомком класса и вам не нужно его преобразовывать, вы должны использовать в качестве

примеров :

var myvar:String = '<data/>';
var othervar:XML = XML(myvar); //right

var myvar:String = '<data/>';
var othervar:XML = (myvar as XML); //wrong

var myvar:XML = <data/>;
var othervar:XML = myvar as XML; // right
5
ответ дан 30 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: