Buscar:

lunes, 21 de febrero de 2011

El lenguaje ActionScript y su Sintaxis 4ª Parte (Final)



Condicionales

ActionScript 3.0 proporciona tres sentencias condicionales básicas que se pueden usar para controlar el flujo del programa.

if..else
La sentencia condicional if..else permite comprobar una condición y ejecutar un bloque de código si dicha condición existe, o ejecutar un bloque de código alternativo si la condición no existe. Por ejemplo, el siguiente fragmento de código comprueba si el valor de x es superior a 20 y genera una función trace() en caso afirmativo o genera una función trace() diferente en caso negativo:

if (x > 20)
{
trace("x es > 20");
}
else
{
trace("x es <= 20");
}


Si no desea ejecutar un bloque de código alternativo, se puede utilizar la sentencia if sin la sentencia else.

if..else if

Puede comprobar varias condiciones utilizando la sentencia condicional if..else if. Por ejemplo, el siguiente fragmento de código no sólo comprueba si el valor de x es superior a 20, sino que también comprueba si el valor de x es negativo:

if (x > 20)
{
trace("x is > 20");
}
else if (x < 0)
{
trace("x is negative");
}


Si una sentencia if o else va seguida de una sola sentencia, no es necesario escribir dicha sentencia entre llaves. Por ejemplo, en el código siguiente no se usan llaves:

if (x > 0)
trace("x es positivo");
else if (x < 0)
trace("x es negativo");
else
trace("x es 0");


No obstante, Adobe recomienda utilizar siempre llaves, ya que podría producirse un comportamiento inesperado si más adelante se añadieran sentencias a una sentencia condicional que no esté escrita entre llaves. Por ejemplo, en el código siguiente el valor de positivoNums aumenta en 1 independientemente de si la evaluación de la condición devuelve true:

var x:int;
var positivoNums:int = 0;
if (x > 0)
trace("x es positivo");
positivoNums++;
trace(positivoNums); // 1


switch
La sentencia switch resulta útil si hay varios hilos de ejecución que dependen de la misma expresión de condición. La funcionalidad que proporciona es similar a una serie larga de sentencias if..else if, pero su lectura resulta un tanto más sencilla. En lugar de probar una condición para un valor booleano, la sentencia switch evalúa una expresión y utiliza el resultado para determinar el bloque de código que debe ejecutarse. Los bloques de código empiezan por una sentencia case y terminan con una sentencia break. Por ejemplo, la siguiente sentencia switch imprime el día de la semana en función del número de día devuelto por el método Date.getDay():

var Fecha:Date = new Date();
var DiaNum:uint = Fecha.getDay();
switch(DiaNum)
{
    case 0:
        trace("Domingo");
    break;
    case 1:
        trace("Lunes");
    break;
    case 2:
        trace("Martes");
    break;
    case 3:
        trace("Miercoles");
    break;
    case 4:
        trace("Jueves");
    break;
    case 5:
        trace("Viernes");
    break;
    case 6:
        trace("Sábado");
    break;
    default:
        trace("Fuera de Rango");
    break;
}
Reproducir indefinidamente

Las sentencias de bucle permiten ejecutar un bloque específico de código repetidamente utilizando una serie de valores o variables. Adobe recomienda escribir siempre el bloque de código entre llaves ({}). Aunque puede omitir las llaves si el bloque de código sólo contiene una sentencia, no es recomendable que lo haga por la misma razón expuesta para las condicionales: aumenta la posibilidad de que las sentencias añadidas posteriormente se excluyan inadvertidamente del bloque de código. Si posteriormente se añade una sentencia que se desea incluir en el bloque de código, pero no se añaden las llaves necesarias, la sentencia no se ejecutará como parte del bucle.

for
El bucle for permite repetir una variable para un rango de valores específico. Debe proporcionar tres expresiones en una sentencia for: una variable que se establece con un valor inicial, una sentencia condicional que determina cuándo termina la reproducción en bucle y una expresión que cambia el valor de la variable con cada bucle. Por ejemplo, el
siguiente código realiza cinco bucles. El valor de la variable i comienza en 0 y termina en 4, mientras que la salida son los números 0 a 4, cada uno de ellos en su propia línea.

var i:int;
for (i = 0; i < 5; i++)
{
trace(i);
}


for..in
El bucle for..in recorre las propiedades de un objeto o los elementos de un conjunto. Por ejemplo, se puede utilizar un bucle for..in para recorrer las propiedades de un objeto genérico (las propiedades de un objeto no se guardan en ningún orden concreto, por lo que pueden aparecer en un orden aparentemente impredecible):

var miObj:Object = {x:20, y:30};
for (var i:String in miObj)
{
    trace(i + ": " + miObj[i]);
}
// Salida:
// x: 20
// y: 30


También se pueden recorrer los elementos de un conjunto:

var miArray:Array = ["uno", "dos", "tres"];
for (var i:String in miArray)
{
    trace(miArray[i]);
}
// Salida:
// uno
// dos
// tres


Lo que no se puede hacer es repetir las propiedades de un objeto si se trata de una instancia de una clase definida por el usuario, a no ser que la clase sea una clase dinámica. Incluso con instancias de clases dinámicas, sólo se pueden repetir las propiedades que se añadan dinámicamente.

for each..in
El bucle for each..in recorre los elementos de una colección, que puede estar formada por las etiquetas de un objeto XML o XMLList, los valores de las propiedades de un objeto o los elementos de un conjunto. Por ejemplo, como muestra el fragmento de código siguiente, el bucle for each..in se puede utilizar para recorrer las propiedades de un objeto genérico, pero al contrario de lo que ocurre con el bucle for..in, la variable de iteración de los bucles
for each..in contiene el valor contenido por la propiedad en lugar del nombre de la misma:

var miObj:Object = {x:20, y:30};
for each (var num in miObj)
{
    trace(num);
}
// Salida:
// 20
// 30


Se puede recorrer un objeto XML o XMLList, como se indica en el siguiente ejemplo:

var miXML:XML = <users>
<fname>Jane</fname>
<fname>Susan</fname>
<fname>John</fname>
</users>;

for each (var item in miXML.fname)
{
    trace(item);
}
/* output
Jane
Susan
John
*/


También se pueden recorrer los elementos de un conjunto, como se indica en este ejemplo:

var miArray:Array = ["uno", "dos", "tres"];
for each (var item in miArray)
{
    trace(item);
}
// Salida:
// uno
// dos
// tres


No se pueden recorrer las propiedades de un objeto si el objeto es una instancia de una clase cerrada. Tampoco se pueden recorrer las propiedades fijas (propiedades definidas como parte de una definición de clase), ni siquiera para las instancias de clases dinámicas.

while
El bucle while es como una sentencia if que se repite con tal de que la condición sea true. Por ejemplo, el código siguiente produce el mismo resultado que el ejemplo del bucle for:

var i:int = 0;
while (i < 5)
{
    trace(i);
    i++;
}


Una desventaja que presenta el uso de los bucles while frente a los bucles for es que es más probable escribir un bucle infinito con bucles while. El código de ejemplo de bucle for no se compila si se omite la expresión que aumenta la variable de contador, mientras que el ejemplo de bucle while sí se compila si se omite dicho paso. Sin la expresión que incrementa i, el bucle se convierte en un bucle infinito.

do..while
El bucle do..while es un bucle while que garantiza que el bloque de código se ejecuta al menos una vez, ya que la condición se comprueba después de que se ejecute el bloque de código. El código siguiente muestra un ejemplo simple de un bucle do..while que genera una salida aunque no se cumple la condición:

var i:int = 5;
do
{
    trace(i);
    i++;
} while (i < 5);
// Salida: 5


Funciones

Las funciones son bloques de código que realizan tareas específicas y pueden reutilizarse en el programa. Hay dos tipos de funciones en ActionScript 3.0: métodos y cierres de función. Llamar a una función método o cierre de función depende del contexto en el que se define la función. Una función se denomina método si se define como parte de una definición de clase o se asocia a una instancia de un objeto. Y se denomina cierre de función si se define de cualquier otra manera.
Las funciones siempre han sido muy importantes en ActionScript. Por ejemplo, en ActionScript 1.0 la palabra clave class no existía, por lo que las "clases" se definían mediante funciones constructoras. Aunque la palabra clave class se añadió posteriormente al lenguaje, sigue siendo importante comprender a fondo las funciones para aprovechar al máximo las capacidades del lenguaje. Esto puede ser difícil de entender para los programadores que esperan que las funciones de ActionScript se comporten de forma similar a las funciones de lenguajes como C++ o Java. Aunque una definición básica de función e invocación no debe resultar difícil para los programadores con experiencia, algunas de las características más avanzadas de las funciones de ActionScript requieren una explicación.

Fundamentos de la utilización de funciones:
En esta sección se ofrece una definición básica de función y se describen las técnicas de invocación.
Invocación de funciones:
Para llamar a una función se utiliza su identificador seguido del operador paréntesis (()). Se puede utilizar el operador paréntesis para escribir los parámetros de función que se desea enviar a la función. Por ejemplo, la función trace(), que es una función de nivel superior en ActionScript 3.0, se usa por todo el tutorial:

trace("Uso de seguimiento para ayudar a depurar el script");


Si se llama a una función sin parámetros, hay que utilizar un par de paréntesis vacíos. Por ejemplo, se puede utilizar el método Math.random(), que no admite parámetros, para generar un número aleatorio:

var randomNum:Number = Math.random();

Funciones definidas por el usuario:
Hay dos formas de definir una función en ActionScript 3.0: se puede utilizar una sentencia de función o una expresión de función. La técnica que se elija dependerá de si se prefiere un estilo de programación más estático o más dinámico.
Si se prefiere la programación estática, o en modo estricto, se deben definir las funciones con sentencias de función.
Las funciones deben definirse con expresiones de función si existe la necesidad específica de hacerlo. Las expresiones de función se suelen usar en programación dinámica (en modo estándar).

Sentencias de función:
Las sentencias de función son la técnica preferida para definir funciones en modo estricto. Una sentencia de función empieza con la palabra clave function, seguida de:

  • El nombre de la función
  • Los parámetros, en una lista delimitada por comas y escrita entre paréntesis
  • El cuerpo de la función (es decir, el código ActionScript que debe ejecutarse cuando se invoca la función), escrito entre llaves.

    Por ejemplo, el código siguiente crea una función que define un parámetro y después invoca la función con la cadena "Hola" como valor del parámetro:

    function
    traceParametro(aParam:String)
    {
        trace(aParam);
    }
    traceParametro("Hola"); // Hola
Expresiones de función:
La segunda manera de declarar una función es utilizar una sentencia de asignación con una expresión de función (también se suele llamar literal de función o función anónima). Éste es un método que requiere escribir más y que se usaba mucho en versiones anteriores de ActionScript.
Una sentencia de asignación con una expresión de función empieza por la palabra clave var, seguida de:

  • • El nombre de la función
  • El operador dos puntos (:)
  • La clase Function para indicar el tipo de datos
  • El operador de asignación (=)
  • La palabra clave function
  • Los parámetros, en una lista delimitada por comas y escrita entre paréntesis
  • El cuerpo de la función (es decir, el código ActionScript que debe ejecutarse cuando se invoca la función), escrito entre llaves.

    Por ejemplo, el código siguiente declara la función traceParametro mediante una expresión de función:

    var
    traceParametro:Function = function (aParam:String)
    {
        trace(aParam);
    };
    traceParametro("Hola"); // Hola


    Tenga en cuenta que, a diferencia de lo que ocurre en una sentencia de función, no se especifica un nombre de función. Otra diferencia importante entre las expresiones de función y las sentencias de función es que una expresión de función es una expresión, no una sentencia. Esto significa que una expresión de función no es independiente, como una sentencia de función. Una expresión de función sólo se puede utilizar como una parte de una sentencia (normalmente una sentencia de asignación). En el siguiente ejemplo se muestra la asignación de una expresión de función a un elemento de conjunto:

    var traceArray:Array = new Array();
    traceArray[0] = function (aParam:String)
    {
        trace(aParam);
    };
    traceArray[0]("Hola");
Criterios para elegir entre sentencias y expresiones:
Como regla general, se debe utilizar una sentencia de función a menos que circunstancias específicas requieran una expresión. Las sentencias de función son menos detalladas y proporcionan una experiencia más uniforme entre el modo estricto y el modo estándar que las expresiones de función.
También son más fáciles de leer que las sentencias de asignación que contienen expresiones de función. Por otra parte, las sentencias de función hacen que el código sea más conciso; son menos confusas que las expresiones de función, que requieren utilizar las palabras clave var y function.
Además, proporcionan una experiencia más uniforme entre los dos modos de compilador, ya que permiten utilizar la sintaxis con punto en modo estándar y en modo estricto para invocar un método declarado con una sentencia de función. Esto no es así necesariamente para los métodos declarados con una expresión de función. Por ejemplo, el código siguiente define una clase denominada Ejemplo con dos métodos: MetodoExpresion(), que se declara con
una expresión de función, y MetodoSentencia(), que se declara con una sentencia de función. En modo estricto no se puede utilizar la sintaxis con punto para invocar el método MetodoExpresion().

class Ejemplo
{
    var MetodoExpresion = function() {}
    function MetodoSentencia() {}
}
var miEj:Ejemplo = new Ejemplo();
miEj.MetodoExpresion(); // error en modo estricto, bien en modo estándar
miEj.MetodoSentencia(); // bien en modo estricto y estándar


Las expresiones de función se consideran más apropiadas para la programación centrada en el comportamiento dinámico (en tiempo de ejecución). Si se prefiere utilizar el modo estricto, pero también hay que llamar a un método declarado con una expresión de función, se puede utilizar cualquiera de las dos técnicas. En primer lugar, se puede llamar al método utilizando corchetes ([]) en lugar del operador punto (.). La siguiente llamada a método funciona
correctamente tanto en modo estricto como en modo estándar:

miEjemplo["MedotoLiteral"]();

En segundo lugar, se puede declarar toda la clase como una clase dinámica. Aunque esto permite llamar al método con el operador punto, la desventaja es que se sacrifica parte de la funcionalidad en modo estricto para todas las instancias de la clase. Por ejemplo, el compilador no genera un error si se intenta acceder a una propiedad no definida en una instancia de una clase dinámica.
Hay algunas circunstancias en las que las expresiones de función son útiles. Las expresiones de función se suelen utilizar para crear funciones que se utilizan una sola vez y después se descartan. Otro uso menos común es asociar una función a una propiedad de prototipo.

Hay dos diferencias sutiles entre las sentencias de función y las expresiones de función que se deben tener en cuenta al elegir la técnica que se va a utilizar. La primera diferencia es que las expresiones de función no existen de forma independiente como objetos con respecto a la administración de la memoria y la eliminación de datos innecesarios. Es decir, cuando se asigna una expresión de función a otro objeto, como un elemento de conjunto o una propiedad de objeto, se crea la única referencia a esa expresión de función en el código. Si el conjunto o el objeto al que la expresión de función está asociada se salen del ámbito o deja de estar disponible, se dejará de tener acceso a la expresión de función. Si se elimina el conjunto o el objeto, la memoria utilizada por la expresión de función quedará disponible para la eliminación de datos innecesarios, lo que significa que se podrá recuperar esa memoria y reutilizarla para otros propósitos.

En el siguiente ejemplo se muestra que, para una expresión de función, cuando se elimina la propiedad a la que está asignada la expresión, la función deja de estar disponible. La clase Prueba es dinámica, lo que significa que se puede añadir una propiedad denominada  funcionExp que contendrá una expresión de función. Se puede llamar a la función funcionExp() con el operador punto, pero cuando se elimina la propiedad funcionExp, la función deja de ser accesible.

dynamic class Prueba {}
var miPrueba:Prueba = new Prueba();
// Funcion Expresion
miPrueba.funcionExp = function () { trace("Funcion Expresion") };
miPrueba.funcionExp(); // Funcion Expresion
delete miPrueba.funcionExp;
miPrueba.funcionExp(); // error


Si, por otra parte, la función se define primero con una sentencia de función, existe como su propio objeto y seguirá existiendo incluso después de que se elimine la propiedad a la que está asociada. El operador delete sólo funciona en propiedades de objetos, por lo que incluso una llamada para eliminar la función SentenciaFunc() no funciona.

dynamic class Prueba {}
var miPrueba:Prueba = new Prueba();
//Funcion Sentencia
function SentenciaFun() { trace("Funcion Sentencia") }
miPrueba.Sentencia = SentenciaFun;
miPrueba.Sentencia(); //Funcion Sentencia
delete miPrueba.Sentencia;
delete SentenciaFun; //Sin Efecto
SentenciaFun();//Funcion Sentencia
miPrueba.Sentencia(); //Error


La segunda diferencia entre las sentencias de función y las expresiones de función es que las sentencias de función existen en todo el ámbito en que están definidas, incluso en sentencias que aparecen antes que la sentencia de función.
En cambio, las expresiones de función sólo están definidas para las sentencias posteriores. Por ejemplo, el código siguiente llama correctamente a la función SentenciaPrueba() antes de que se defina:

SentenciaPrueba(); // Prueba Sentencia

function SentenciaPrueba():void
{
    trace("SentenciaPrueba");
}


Las expresiones de función no están disponibles antes de ser definidas, por lo que el código siguiente produce un error en tiempo de ejecución:

ExpresionPrueba(); // Error en tiempo de ejecucion

var ExpresionPrueba:Function = function ()
{
    trace("ExpresionPrueba");
}


Devolución de valores de funciones:
Para devolver un valor de la función se debe utilizar la sentencia return seguida de la expresión o el valor literal que se desea devolver. Por ejemplo, el código siguiente devuelve una expresión que representa al parámetro:

function DobleNum(baseNum:int):int
{
    return (baseNum * 2);
}


Tenga en cuenta que la sentencia return finaliza la función, por lo que las sentencias que estén por debajo de una sentencia return no se ejecutarán, como se indica a continuación:

function DobleNum(baseNum:int):int
{
    return (baseNum * 2);
    trace("Despues de return"); // Esta sentencia trace no se ejecutará.

}

En modo estricto se debe devolver un valor del tipo apropiado si se elige especificar un tipo devuelto. Por ejemplo, el código siguiente genera un error en modo estricto porque no devuelve un valor válido:

function DobleNum(baseNum:int):int
{
    trace("Despues de return");
}


Funciones anidadas:
Es posible anidar funciones, lo que significa que pueden declararse funciones dentro de otras funciones. Una función anidada sólo está disponible dentro de su función principal, a menos que se pase una referencia a la función a código externo. Por ejemplo, el código siguiente declara dos funciones anidadas dentro de la función getNombreyVersion():

function getNombreyVersion():String
{
    function getVersion():String
    {
        return "10";
    }
    function getNombre():String
    {
        
return "Flash Player";
    }
    return (getNombre() + " " + getVersion());
}
trace(getNombreyVersion()); // Flash Player 10


Cuando se pasan funciones anidadas a código externo, se pasan como cierres de función, lo que significa que la función retiene todas las definiciones que hubiera en el ámbito cuando se definió la función.

Parámetros de función:
ActionScript 3.0 proporciona funcionalidad para los parámetros de función que puede resultar novedosa para los programadores que empiecen a estudiar el lenguaje. Aunque la mayoría de los programadores deberían estar familiarizados con la idea de pasar parámetros por valor o referencia, es posible que el objeto arguments y el parámetro ... (rest) sean desconocidos para muchos.

Pasar argumentos por valor o por referencia:
En muchos lenguajes de programación, es importante comprender la diferencia entre pasar argumentos por valor o por referencia; esta diferencia puede afectar a la manera de diseñar el código.
Al pasar por valor, el valor del argumento se copia en una variable local para usarlo en la función. Al pasar por referencia, sólo se pasa una referencia al argumento, en lugar del valor real. No se realiza ninguna copia del argumento real. En su lugar, se crea una referencia a la variable pasada como argumento y se asigna dicha referencia a una variable local para usarla en la función. Como una referencia a una variable externa a la función, la variable local proporciona la capacidad de cambiar el valor de la variable original.
En ActionScript 3.0, todos los argumentos se pasan por referencia, ya que todos los valores se almacenan como objetos.
No obstante, los objetos que pertenecen a los tipos de datos simples, como Boolean, Number, int, uint y String, tienen operadores especiales que hacen que se comporten como si se pasaran por valor. Por ejemplo, el código siguiente crea una función denominada pasaPrimitivos() que define dos parámetros denominados xParam y yParam, ambos de
tipo int. Estos parámetros son similares a variables locales declaradas en el cuerpo de la función pasaPrimitivos().
Cuando se llama a la función con los argumentos xValue e yValue, los parámetros xParam e yParam se inicializan con referencias a los objetos int representados por xValue e yValue. Como los argumentos son valores simples, se comportan como si se pasaran por valor. Aunque xParam e yParam sólo contienen inicialmente referencias a los objetos xValue e yValue, los cambios realizados a las variables en el cuerpo de la función generan nuevas copias de los valores en la memoria.

function pasaPrimitivos(xParam:int, yParam:int):void
{
    xParam++;
    yParam++;
    trace(xParam, yParam);
}
var xValue:int = 10;
var yValue:int = 15;
trace(xValue, yValue);// 10 15
pasaPrimitivos(xValue, yValue); // 11 16
trace(xValue, yValue);// 10 15


En la función pasaPrimitivos(), los valores de xParam e yParam se incrementan, pero esto no afecta a los valores de xValue e yValue, como se indica en la última sentencia trace. Esto es así aunque se asigne a los parámetros los mismos nombres que a las variables, xValue e yValue, ya que dentro de la función xValue e yValue señalarían nuevas ubicaciones de la memoria que existen por separado de las variables externas a la función que tienen el mismo nombre.

Todos los demás objetos (es decir, los objetos que no pertenecen a los tipos de datos simples) se pasan siempre por referencia, ya que esto ofrece la capacidad de cambiar el valor de la variable original. Por ejemplo, el código siguiente crea un objeto denominado objVar con dos propiedades, x e y. El objeto se pasa como un argumento a la función pasaByRef(). Como el objeto no es un tipo simple, no sólo se pasa por referencia, sino que también se mantiene como
una referencia. Esto significa que los cambios realizados en los parámetros dentro de la  función afectarán a las propiedades del objeto fuera de la función.

function pasaByRef(objParam:Object):void
{
    objParam.x++;
    objParam.y++;
    trace(objParam.x, objParam.y);
}
var objVar:Object = {x:10, y:15};
trace(objVar.x, objVar.y); // 10 15
pasaByRef(objVar); // 11 16
trace(objVar.x, objVar.y); // 11 16


El parámetro objParam hace referencia al mismo objeto que la variable objVar global. Como se puede ver en las sentencias trace del ejemplo, los cambios realizados en las propiedades x e y del objeto objParam se reflejan en el objeto objVar.

Valores predeterminados de los parámetros:
En ActionScript 3.0 se incluye como novedad la capacidad de declarar valores predeterminados de parámetros para una función. Si una llamada a una función con valores predeterminados de parámetros omite un parámetro con valores predeterminados, se utiliza el valor especificado en la definición de la función para ese parámetro. Todos los parámetros con valores predeterminados deben colocarse al final de la lista de parámetros. Los valores asignados como valores predeterminados deben ser constantes de tiempo de compilación. La existencia de un valor predeterminado para un parámetro convierte de forma efectiva a ese parámetro en un parámetro opcional. Un parámetro sin un valor predeterminado se considera un parámetro requerido.

Por ejemplo, el código siguiente crea una función con tres parámetros, dos de los cuales tienen valores predeterminados. Cuando se llama a la función con un solo parámetro, se utilizan los valores predeterminados de los parámetros.

function defaultValor(x:int, y:int = 3, z:int = 5):void
{
    trace(x, y, z);
}
defaultValor(1); // 1 3 5
El objeto arguments:
Cuando se pasan parámetros a una función, se puede utilizar el objeto arguments para acceder a información sobre los parámetros pasados a la función. Algunos aspectos importantes del objeto arguments son:

  • El objeto arguments es un conjunto que incluye todos los parámetros pasados a la función.
  • La propiedad arguments.length notifica el número de parámetros pasados a la función.
  • La propiedad arguments.callee proporciona una referencia a la misma función, que resulta útil para llamadas recursivas a expresiones de función.

    Nota
    : el objeto arguments no estará disponible si algún parámetro tiene el nombre arguments o si se utiliza el parámetro ... (rest).


    Si se hace referencia al objeto arguments en el cuerpo de una función, ActionScript 3.0 permite que las llamadas a funciones incluyan más parámetros que los definidos en la definición de la función, pero generará un error del compilador en modo estricto si el número de parámetros no coincide con el número de parámetros requeridos (y de forma opcional, los parámetros opcionales). Se puede utilizar el conjunto aspect del objeto arguments para acceder a cualquier parámetro pasado a la función, independientemente de si ese parámetro está definido en la definición de la función. En el ejemplo siguiente, que sólo compila en modo estándar, se utiliza el conjunto arguments junto con la propiedad arguments.length para hacer un seguimiento de todos los parámetros pasados a la
    función traceArgArray():


    function
    traceArgArray(x:int):void
    {
        for (var i:uint = 0; i < arguments.length; i++)
        {
            trace(arguments[i]);
        }
    }
    traceArgArray(1, 2, 3);
    // Salida:
    // 1
    // 2
    // 3


    La propiedad arguments.callee se suele utilizar en funciones anónimas para crear recursión. Se puede utilizar para añadir flexibilidad al código. Si el nombre de una función recursiva cambia a lo largo del ciclo de desarrollo, no es necesario preocuparse de cambiar la llamada recursiva en el cuerpo de la función si se utiliza arguments.callee en lugar del nombre de la función. La propiedad arguments.callee se utiliza en la siguiente expresión de función para habilitar la recursión:


    var
    factorial:Function = function (x:uint)
    {
        if(x == 0)
        {
            return 1;
        }
        else
        {
            return (x * arguments.callee(x - 1));
        }
    }
    trace
    (factorial(5)); // 120
    Si se utiliza el parámetro ... (rest) en la declaración de la función, el objeto arguments no estará disponible. Hay que acceder a los parámetros a través de los nombres de parámetro declarados.

    También hay que procurar no utilizar la cadena "arguments" como nombre de parámetro, ya que ocultará el objeto arguments. Por ejemplo, si se vuelve a escribir la función traceArgArray() de forma que se añade un parámetro arguments, las referencias a arguments en el cuerpo de la función hacen referencia al parámetro, en lugar de al objeto arguments. El siguiente código no produce ningún resultado:


    function traceArgArray(x:int, arguments:int):void
    {
        for (var i:uint = 0; i < arguments.length; i++)
        {
            trace(arguments[i]);
        }
    }
    traceArgArray(1, 2, 3);
    // Sin Salida

    El objeto arguments de versiones anteriores de ActionScript también contenía una propiedad denominada caller, que es una referencia a la función que llamó a la función actual. La propiedad caller no existe en ActionScript 3.0, pero si se necesita una referencia a la función que llama, se puede modificar dicha función de forma que pase un parámetro adicional que sea una referencia sí mismo. 
El parámetro ...(rest):
ActionScript 3.0 introduce una declaración de un parámetro nuevo que se llama ... (rest). Este parámetro permite especificar un parámetro de tipo conjunto que acepta un número arbitrario de argumentos delimitados por comas. El parámetro puede tener cualquier nombre que no sea una palabra reservada. Este parámetro debe especificarse al último. El uso de este parámetro hace que el objeto arguments no esté disponible. Aunque el parámetro ... (rest) ofrece la misma funcionalidad que el conjunto arguments y la propiedad arguments.length, no proporciona funcionalidad similar a la que ofrece arguments.callee. Hay que asegurarse de que no es necesario utilizar arguments.callee
antes de utilizar el parámetro ... (rest).

En el ejemplo siguiente se reescribe la función traceArgArray() con el parámetro ... (rest) en lugar del objeto arguments:

function traceArgArray(... args):void
{
    for (var i:uint = 0; i < args.length; i++)
    {
        trace(args[i]);
    }
}
traceArgArray(1, 2, 3);
// Salida:
// 1
// 2
// 3

El parámetro ... (rest) también puede utilizarse con otros parámetros, con tal de que sea el último parámetro de la lista. 
En el ejemplo siguiente se modifica la función traceArgArray() de forma que su primer parámetro, x, sea de tipo int y el segundo parámetro utilice el parámetro ... (rest). La salida omite el primer valor porque el primer parámetro ya no forma parte del conjunto creada por el parámetro ... (rest).


function traceArgArray(x: int, ... args)
{
    for (var i:uint = 0; i < args.length; i++)
    {
        trace(args[i]);
    }
}
traceArgArray(1, 2, 3);
// Salida:
// 2
// 3
Funciones como objetos:
En ActionScript 3.0 las funciones son objetos. Al crear una función, se crea un objeto que no sólo se puede pasar como un parámetro a otra función, sino que además tiene propiedades y métodos asociados.
Las funciones pasadas como argumentos a otra función se pasan por referencia, no por valor. Al pasar una función como un argumento sólo se utiliza el identificador y no el operador paréntesis que se utiliza para llamar al método. Por ejemplo, el código siguiente pasa una función denominada clickListener() como un argumento al método addEventListener():

addEventListener(MouseEvent.CLICK, clickListener);

El método Array.sort() también define un parámetro que acepta una función.




Aunque pueda parecer extraño a los programadores sin experiencia en ActionScript, las funciones pueden tener propiedades y métodos, igual que cualquier otro objeto. De hecho, cada función tiene una propiedad de sólo lectura denominada length que almacena el número de parámetros definidos para la función. Es distinta de la propiedad arguments.length, que notifica el número de argumentos enviados a la función. Debe recordarse que en ActionScript el número de argumentos enviados a una función pueden superar el número de parámetros definidos para dicha función. En el ejemplo siguiente, que sólo se compila en modo estándar porque el modo estricto requiere una coincidencia exacta entre el número de argumentos pasados y el número de parámetros definidos, se muestra la diferencia entre las dos propiedades:

// Solo se compila en modo estandar
function traceLength(x:uint, y:uint):void
{
trace("Argumentos recibidos: " + arguments.length);
trace("Argumentos esperados: " + traceLength.length);
}
traceLength(3, 5, 7, 11);
/* Salida:
Argumentos recividos: 4
Argumentos esperados: 2 */


En modo estándar se pueden definir propiedades de función propias fuera del cuerpo de la función. Las propiedades de función pueden servir como propiedades casi estáticas que permiten guardar el estado de una variable relacionada con la función. Por ejemplo, si se desea hacer un seguimiento del número de veces que se llama a una función determinada. Esta funcionalidad puede ser útil cuando se programa un juego y se desea hacer un seguimiento del número de veces que un usuario utiliza un comando específico, aunque también se podría utilizar una propiedad de clase estática para esto. El ejemplo siguiente, que sólo compila en modo estándar porque el modo estricto no permite añadir propiedades dinámicas a funciones, crea una propiedad de función fuera de la declaración de función e
incrementa la propiedad cada vez que se llama a la función:


// Solo se compila en modo estandar
var AlgunaFuncion:Function = function ():void
{
    AlgunaFuncion.counter++;
}
AlgunaFuncion.counter = 0;AlgunaFuncion();AlgunaFuncion();
trace(
AlgunaFuncion.counter); // 2
Ámbito de una función:
El ámbito de una función determina no sólo en qué partes de un programa se puede llamar a esa función, sino también a qué definiciones tiene acceso la función. Las mismas reglas de ámbito que se aplican a los identificadores de variable se aplican a los identificadores de función. Una función declarada en el ámbito global estará disponible en todo el código. Por ejemplo, ActionScript 3.0 contiene funciones globales, como isNaN() y parseInt(), que están disponibles desde cualquier punto del código. Una función anidada (una función declarada dentro de otra función) puede utilizarse en cualquier punto de la función en que se declaró.

La cadena de ámbitos:
Cuando se inicia la ejecución de una función, se crean diversos objetos y propiedades. En primer lugar, se crea un objeto especial denominado objeto de activación que almacena los parámetros y las variables o funciones locales declaradas en el cuerpo de la función. No se puede acceder al objeto de activación directamente, ya que es un mecanismo interno. En segundo lugar, se crea una cadena de ámbitos que contiene una lista ordenada de objetos en
las que Flash Player o Adobe AIR comprueba las declaraciones de identificadores. Cada función que ejecuta tiene una cadena de ámbitos que se almacena en una propiedad interna. Para una función anidada, la cadena de ámbitos empieza en su propio objeto de activación, seguido del objeto de activación de la función principal. La cadena continúa de esta manera hasta que llega al objeto global. El objeto global se crea cuando se inicia un programa de ActionScript y contiene todas las variables y funciones globales.

Cierres de función:
Un cierre de función es un objeto que contiene una instantánea de una función y su entorno léxico. El entorno léxico de una función incluye todas las variables, propiedades, métodos y objetos de la cadena de ámbitos de la función, junto con sus valores. Los cierres de función se crean cada vez que una función se ejecuta aparte de un objeto o una clase. El hecho de que los cierres de función conserven el ámbito en que se definieron crea resultados interesantes cuando se pasa una función como un argumento o un valor devuelto en un ámbito diferente.
Por ejemplo, el código siguiente crea dos funciones: foo(), que devuelve una función anidada denominada rectArea() que calcula el área de un rectángulo y bar(), que llama a foo() y almacena el cierre de función devuelto en una variable denominada miProducto. Aunque la función bar() define su propia variable local x (con el valor 2), cuando se llama al cierre de función miProducto(), conserva la variable x (con el valor 40) definida en la función foo(). Por tanto, la función bar() devuelve el valor 160 en lugar de8.

function foo():Function
{
    var x:int = 40;
    function rectArea(y:int):int // Funcion de cierre definido
    {
        return x * y
    }
    return rectArea;
}
function bar():void
{
    var x:int = 2;
    var y:int = 4;
    var miProducto:Function = foo();
    trace(miProducto(4)); // Cierre de funcion llamada
}
bar(); // 160

Los métodos se comportan de manera similar, ya que también conservan información sobre el entorno léxico en que se crearon. Esta característica se aprecia especialmente cuando se extrae un método de su instancia, lo que crea un método vinculado. La diferencia principal entre un cierre de función y un método vinculado es que el valor de la palabra clave this en un método vinculado siempre hace referencia a la instancia a la que estaba asociado originalmente, mientras que en un cierre de función el valor de la palabra clave this puede cambiar.

martes, 15 de febrero de 2011

El lenguaje ActionScript y su Sintaxis 3ª Parte


Sintaxis
La sintaxis de un lenguaje define un conjunto de reglas que deben cumplirse al escribir código ejecutable.
Distinción entre mayúsculas y minúsculas:
El lenguaje ActionScript 3.0 distingue mayúsculas de minúsculas. Los identificadores que sólo se diferencien en mayúsculas o minúsculas se considerarán identificadores distintos. Por ejemplo, el código siguiente crea dos variables
distintas:

var num1:int;
var Num1:int;

Sintaxis con punto:
El operador de punto (.) permite acceder a las propiedades y los métodos de un objeto. La sintaxis con punto permite hacer referencia a una propiedad o un método de clase mediante un nombre de instancia, seguido del operador punto y el nombre de la propiedad o el método. Por ejemplo, considere la siguiente definición de clase:

class Ejemplo
{
public var Propiedad1:String;
public function Metodo1():void {}
}

La sintaxis con punto permite acceder a la propiedad Propiedad1 y al método Metodo1() utilizando el nombre de la instancia creada en el código siguiente:

var MiEjemplo:Ejemplo = new Ejemplo();
MiEjemplo.Propiedad1 = "Hola";
MiEjemplo.Metodo1();

Se puede utilizar la sintaxis con punto al definir paquetes. El operador punto se utiliza para hacer referencia a paquetes anidados. Por ejemplo, la clase EventDispatcher reside en un paquete denominado events que está anidado dentro del paquete denominado flash. Se puede hacer referencia al paquete events mediante la siguiente expresión:

flash.events

También se puede hacer referencia a la clase EventDispatcher mediante esta expresión:

flash.events.EventDispatcher

Sintaxis con barras diagonales:
ActionScript 3.0 no admite la sintaxis con barras diagonales. Esta sintaxis se utilizaba en versiones anteriores de ActionScript para indicar la ruta a un clip de película o una variable.

Literales:
Un literal es un valor que aparece directamente en el código. Todos los ejemplos siguientes son literales:
17
"hello"
-3
9.4
null
undefined
true
false
Los literales también pueden agruparse para formar literales compuestos. Los literales de conjunto se escriben entre corchetes ([]) y utilizan la coma para separar los elementos de conjunto.
Un literal de conjunto puede utilizarse para inicializar un conjunto. En los siguientes ejemplos se muestran dos conjuntos que se inicializan mediante literales de conjunto. Se puede utilizar la sentencia new y pasar el literal compuesto como parámetro al constructor de la clase Array, pero también se pueden asignar valores literales directamente al crear instancias de las siguientes clases principales de ActionScript: Object, Array, String, Number, int, uint, XML, XMLList y Boolean.

// Utilice la nueva declaracion.
var miStrings:Array = new Array(["alpha", "beta", "gamma"]);
var miNums:Array = new Array([1,2,3,5,8]);
// Asignar literales directamente.
var miStrings:Array = ["alpha", "beta", "gamma"];
var miNums:Array = [1,2,3,5,8];

Los literales también se pueden utilizar para inicializar un objeto genérico. Un objeto genérico es una instancia de la clase Object. Los literales de objetos se escriben entre llaves ({}) y utilizan la coma para separar las propiedades del objeto. Cada propiedad se declara mediante el signo de dos puntos (:), que separa el nombre de la propiedad del valor de la propiedad.
Se puede crear un objeto genérico utilizando la sentencia new y pasar el literal de objeto como parámetro al constructor de la clase Object, o bien asignar el literal de objeto directamente a la instancia que se está declarando. En el siguiente ejemplo se muestran dos formas de crear un nuevo objeto genérico y se inicializa el objeto con tres propiedades (propA, propB y propC) establecidas en los valores 1, 2 y 3 respectivamente:

//Utilice la nueva declaración y añadir propiedades.
var miObject:Object = new Object();
miObject.propA = 1;
miObject.propB = 2;
miObject.propC = 3;
// Asignar literales directamente.
var miObject:Object = {propA:1, propB:2, propC:3};


Signos de punto y coma:
Se puede utilizar el signo de punto y coma (;) para finalizar una sentencia. Como alternativa, si se omite el signo de punto y coma, el compilador dará por hecho que cada línea de código representa a una sentencia independiente. Como muchos programadores están acostumbrados a utilizar el signo de punto y coma para indicar el final de una sentencia,
el código puede ser más legible si se usan siempre signos de punto y coma para finalizar las sentencias.
El uso del punto y coma para terminar una sentencia permite colocar más de una sentencia en una misma línea, pero esto hará que el código resulte más difícil de leer.


Paréntesis:
Los paréntesis (()) se pueden utilizar de tres modos diferentes en ActionScript 3.0. En primer lugar, se pueden utilizar para cambiar el orden de las operaciones de una expresión. Las operaciones agrupadas entre paréntesis siempre se ejecutan primero. Por ejemplo, se utilizan paréntesis para modificar el orden de las operaciones en el código siguiente:

trace(2 + 3 * 4); // 14
trace((2 + 3) * 4); // 20

En segundo lugar, se pueden utilizar paréntesis con el operador coma (,) para evaluar una serie de expresiones y devolver el resultado de la expresión final, como se indica en el siguiente ejemplo:

var a:int = 2;
var b:int = 3;
trace((a++, b++, a+b)); // 7

Por último, se pueden utilizar paréntesis para pasar uno o más parámetros a funciones o métodos, como se indica en el siguiente ejemplo, que pasa un valor String a la función trace():

trace("Hola"); // Hola

Comentarios:
El código de ActionScript 3.0 admite dos tipos de comentarios: comentarios de una sola línea y comentarios multilínea.
Estos mecanismos para escribir comentarios son similares a los equivalentes de C++ y Java. El compilador omitirá el texto marcado como un comentario.
Los comentarios de una sola línea empiezan por dos caracteres de barra diagonal (//) y continúan hasta el final de la línea. Por ejemplo, el código siguiente contiene un comentario de una sola línea:

var Numero:Number = 3; // Comentario de una sola linea

Los comentarios multilínea empiezan con una barra diagonal y un asterisco (/*) y terminan con un asterisco y una barra diagonal (*/).

/* Este es un comentario multilínea que puede abarcar
más de una línea de código.
*/


Palabras clave y palabras reservadas:
Las palabras reservadas son aquellas que no se pueden utilizar como identificadores en el código porque su uso está reservado para ActionScript. Incluyen las palabras clave léxicas, que son eliminadas del espacio de nombres del programa por el compilador. El compilador notificará un error si se utiliza una palabra clave léxica como un identificador. En la tabla siguiente se muestran las palabras clave léxicas de ActionScript 3.0.


Hay un pequeño conjunto de palabras clave, denominadas palabras clave sintácticas, que se pueden utilizar como identificadores, pero que tienen un significado especial en determinados contextos. En la tabla siguiente se muestran las palabras clave sintácticas de ActionScript 3.0.


También hay varios identificadores que a veces se llaman futuras palabras reservadas. ActionScript 3.0 no reserva estos identificadores, aunque el software que incorpore ActionScript 3.0 podrá tratar algunos de ellos como palabras clave.
Es posible que pueda utilizar un gran número de estos identificadores en su código, pero Adobe recomienda que no se utilicen ya que pueden aparecer como palabras clave en una versión posterior de dicho lenguaje.


Constantes:
ActionScript 3.0 admite la sentencia const, que se puede utilizar para crear constantes. Las constantes son propiedades con un valor fijo que no se puede modificar. Se puede asignar un valor a una constante una sola vez y la asignación debe realizarse cerca de la declaración de la constante. Por ejemplo, si se declara una constante como un miembro de una clase, se puede asignar un valor a esa constante únicamente como parte de la declaración o dentro del constructor de la clase.
El código siguiente declara dos constantes. Se asigna un valor a la primera constante, MINIMO, como parte de la sentencia de declaración. A la segunda constante, MAXIMO, se le asigna un valor en el constructor. Es necesario tener en cuenta que este ejemplo sólo compila en modo estándar, ya que el modo estricto sólo permite asignar un valor de constante en tiempo de inicialización.

class A
{
    public const MINIMO:int = 0;
    public const MAXIMO:int;
    public function A()
    {
        MAXIMO = 10;
    }
}
var a:A = new A();
trace(a.MINIMO); // 0
trace(a.MAXIMO); // 10


Se producirá un error si se intenta asignar de otra manera un valor inicial a una constante. Por ejemplo, si se intenta establecer el valor inicial de MAXIMO fuera de la clase, se producirá un error en tiempo de ejecución.

class A
{
public const MINIMO:int = 0;
public const MAXIMO:int;
}
var a:A = new A();
a["MAXIMO"] = 10; // Error en tiempo de ejecución.


ActionScript 3.0 define una amplia gama de constantes para su uso. Por convención, en ActionScript las constantes se escriben en mayúsculas y las palabras que las forman se separan mediante el carácter de subrayado (_). Por ejemplo, la definición de la clase MouseEvent utiliza esta convención de nomenclatura para sus constantes, cada una de las
cuales representa un evento relacionado con una entrada del ratón:

package flash.events
{
    public class MouseEvent extends Event
    {
        public static const CLICK:String = "click";
        public static const DOUBLE_CLICK:String = "doubleClick";
        public static const MOUSE_DOWN:String = "mouseDown";
        public static const MOUSE_MOVE:String = "mouseMove";
        ...
    }
}

Operadores
Los operadores son funciones especiales que se aplican a uno o más operandos y devuelven un valor. Un operando es un valor (generalmente un literal, una variable o una expresión) que se usa como entrada de un operador. Por ejemplo, en el código siguiente, los operadores de suma (+) y multiplicación (*) se usan con tres operandos literales (2, 3 y 4) para devolver un valor. A continuación, el operador de asignación (=) usa este valor para asignar el valor devuelto, 14, a la variable sumNumber.

var sumNumber:uint = 2 + 3 * 4; // uint = 14

Los operadores pueden ser unarios, binarios o ternarios. Un operador unario se aplica a un operando. Por ejemplo, el operador de incremento (++) es un operador unario porque se aplica a un solo operando. Un operador binario se aplica a dos operandos. Por ejemplo, el operador división (/) se aplica a dos operandos. Un operador ternario se aplica a tres
operandos. Por ejemplo, el operador condicional (?:) se aplica a tres operandos.
Algunos operadores están sobrecargados, lo que significa que se comportan de distinta manera en función del tipo o la cantidad de operandos que se les pase. El operador suma (+) es un ejemplo de un operador sobrecargado que se comporta de distinta manera en función del tipo de datos de los operandos. Si ambos operandos son números, el operador suma devuelve la suma de los valores. Si ambos operandos son cadenas, el operador suma devuelve la concatenación de los dos operandos. En el siguiente ejemplo de código se muestra cómo cambia el comportamiento del operador en función de los operandos:

trace(5 + 5); // 10
trace("5" + "5"); // 55

Los operadores también pueden comportarse de distintas maneras en función del número de operandos suministrados. El operador resta (-) es la vez un operador unario y un operador binario. Si se le suministra un solo operando, el operador resta devuelve como resultado la negación del operando. Si se le suministran dos operandos, el operador resta devuelve la diferencia de los operandos. En el siguiente ejemplo se muestra el operador resta usado
primero como un operador unario y después como un operador binario.

trace(-3); // -3
trace(7 - 2); // 5

Precedencia y asociatividad de operadores:
La precedencia y asociatividad de los operadores determina el orden en que se procesan los operadores. Aunque para aquellos usuarios familiarizados con la programación aritmética puede parecer natural que el compilador procese el operador de multiplicación (*) antes que el operador de suma (+), el compilador necesita instrucciones explícitas sobre qué operadores debe procesar primero. Dichas instrucciones se conocen colectivamente como precedencia de
operadores. ActionScript establece una precedencia de operadores predeterminada que se puede modificar utilizando el operador paréntesis (()). Por ejemplo, el código siguiente modifica la precedencia predeterminada del ejemplo anterior para forzar al compilador a procesar el operador suma antes que el operador producto:

var sumNumber:uint = (2 + 3) * 4; // uint == 20

Pueden darse situaciones en las que dos o más operadores con la misma precedencia aparezcan en la misma expresión.
En estos casos, el compilador utiliza las reglas de asociatividad para determinar qué operador se procesa primero.
Todos los operadores binarios, salvo los operadores de asignación, tienen asociatividad desde la izquierda, lo que significa que los operadores de la izquierda se procesan antes que los operadores de la derecha. Los operadores de asignación y el operador condicional (?:) tienen asociatividad desde la derecha, lo que significa que los operadores de la derecha se procesan antes que los operadores de la izquierda.

Consideremos, por ejemplo, los operadores menor que (<) y mayor que (>), que tienen la misma precedencia. Si ambos operadores se utilizan en la misma expresión, el operador de la izquierda se procesará en primer lugar porque ambos operadores tienen asociatividad desde la izquierda. Esto significa que las dos sentencias siguientes generan el mismo resultado:

trace(3 > 2 < 1); // false
trace((3 > 2) < 1); // false

El operador mayor que se procesa primero, lo que devuelve un valor true, ya que el operando 3 es mayor que el operando 2. A continuación, se pasa el valor true al operador menor que, junto con el operando 1. El código siguiente representa este estado intermedio:

trace((true) < 1);

El operador menor que convierte el valor true en el valor numérico 1 y compara dicho valor numérico con el segundo operando 1 para devolver el valor false (el valor 1 no es menor que 1).

trace(1 < 1); // false

Se puede modificar la asociatividad predeterminada desde la izquierda con el operador paréntesis. Se puede ordenar al compilador que procese primero el operador menor que escribiendo dicho operador y sus operandos entre paréntesis. En el ejemplo siguiente se utiliza el operador paréntesis para producir un resultado diferente utilizando los mismos números que en el ejemplo anterior:

trace(3 > (2 < 1)); // true

El operador menor que se procesa primero, lo que devuelve un valor false, ya que el operando 2 no es menor que el operando 1. A continuación, se pasa el valor false al operador mayor que, junto con el operando 3. El código siguiente representa este estado intermedio:
 
trace(3 > (false));

El operador mayor que convierte el valor false en el valor numérico 0 y compara dicho valor numérico con el otro operando 3 para devolver el valor true (el valor 3 es mayor que 0).

trace(3 > 0); // true

En la tabla siguiente se muestran los operadores de ActionScript 3.0 por orden decreciente de precedencia. Cada fila de la tabla contiene operadores de la misma precedencia. Cada fila de operadores tiene precedencia superior a la fila que aparece debajo de ella en la tabla.

Operadores principales:
Los operadores principales incluyen los que se utilizan para crear literales Array y Object, agrupar expresiones, llamar a funciones, crear instancias de clase y acceder a propiedades.
Todos los operadores principales, indicados en la tabla siguiente, tienen la misma precedencia. Los operadores que forman parte de la especificación E4X se indican mediante la notación (E4X).

Operadores de sufijo:
Los operadores de sufijo se aplican a un operador para aumentar o reducir el valor. Aunque estos operadores son unarios, se clasifican por separado del resto de los operadores unarios debido a su mayor precedencia y a su comportamiento especial. Al utilizar un operador de sufijo como parte de una expresión mayor, el valor de la expresión se devuelve antes de que se procese el operador de sufijo. Por ejemplo, el siguiente código muestra cómo se devuelve
el valor de la expresión xNum++ antes de que se incremente el valor:

var xNum:Number = 0;
trace(xNum++); // 0
trace(xNum); // 1

Todos los operadores de sufijo, indicados en la tabla siguiente, tienen la misma precedencia:


Operadores unarios:
Los operadores unarios se aplican a un operando. Los operadores de incremento (++) y decremento (--) de este grupo son operadores de prefijo, lo que significa que aparecen delante del operando en una expresión. Los operadores de prefijo difieren de los correspondientes operadores de sufijo en que la operación de incremento o decremento se
realiza antes de que se devuelva el valor de la expresión global. Por ejemplo, el siguiente código muestra cómo se devuelve el valor de la expresión ++xNum después de que se incremente el valor:

var xNum:Number = 0;
trace(++xNum); // 1
trace(xNum); // 1

Todos los operadores unarios, indicados en la tabla siguiente, tienen la misma precedencia:

Operadores multiplicativos:
Los operadores multiplicativos toman dos operandos y realizan cálculos de multiplicación, división o módulo.
Todos los operadores multiplicativos, indicados en la tabla siguiente, tienen la misma precedencia:


Operadores aditivos:
Los operadores aditivos se aplican a dos operandos y realizan cálculos de suma y resta. Todos los operadores aditivos, indicados en la tabla siguiente, tienen la misma precedencia:

Operadores de desplazamiento en modo bit:
Los operadores de desplazamiento en modo bit se aplican a dos operandos y desplazan los bits del primer operando según lo especificado por el segundo operando. Todos los operadores de desplazamiento en modo de bit, indicados en la tabla siguiente, tienen la misma precedencia:

Operadores relacionales:
Los operadores relacionales se aplican a dos operandos, comparan sus valores y devuelven un valor booleano. Todos los operadores relacionales, indicados en la tabla siguiente, tienen la misma precedencia:

Operadores de igualdad:
Los operadores de igualdad se aplican a dos operandos, comparan sus valores y devuelven un valor booleano. Todos los operadores de igualdad, indicados en la tabla siguiente, tienen la misma precedencia:

Operadores lógicos en modo bit:
Los operadores lógicos en modo bit se aplican a dos operandos y realizan operaciones lógicas a nivel de bits. Estos operadores, que tienen una precedencia diferente, se enumeran en la tabla siguiente por orden decreciente de precedencia:

Operadores lógicos:
Los operadores lógicos se aplican a dos operandos y devuelven un resultado booleano. Estos operadores, que tienen distintas precedencias, se enumeran en la tabla siguiente por orden decreciente de precedencia:

Operador condicional:
El operador condicional es un operador ternario, lo que significa que se aplica a tres operandos. El operador condicional es un método abreviado para aplicar la sentencia condicional if..else.





Operadores de asignación:
Los operadores de asignación se aplican a dos operandos y asignan un valor a un operando en función del valor del otro operando. Todos los operadores de asignación, indicados en la tabla siguiente, tienen la misma precedencia:










Brindanos tus Donaciones