Blog

ExtJS and Sencha Touch Themes and Templates

Referencias en JavaScript

Mar 02, 2009 | Español | By | 22 Comments | Read in English

Una referencia es un puntero al lugar exacto donde se encuentra un objeto, en JavaScript este es un concepto fundamental que debemos conocer y dominar.

Referencias en JavaScript
Author: Crysfel

I'm a software developer with 6+ years of experience, when I'm not developing software I may be writing a tutorial, you can follow me on twitter

Definición

Físicamente los objetos están alojados en la memoria y accedemos a ellos mediante una referencia, la cual esta contenida en una variable. Múltiples variables pueden hacer referencia al mismo objeto, a su vez este objeto puede contener referencias a otros objetos como por ejemplo strings, numbers, arrays, etc.

Cuando múltiples variables apuntan a un mismo objeto y éste es modificado, el cambio se reflejará en todas las variables que están haciendo referencia al objeto. Un ejemplo de esto es lo siguiente:

//Se crea un objeto vacío
var obj = {};

//Se crea una referencia
var reference = obj;

//Se agrega una propiedad al objeto original
obj.property = 1;

//La referencia puede acceder a la propiedad recién creada
console.debug('reference.property = '+reference.property);

El mismo principio se aplica para los arreglos, aunque estos se modifican a si mismos mediante el método “push” las referencias se verán afectadas. Analicemos el ejemplo siguiente:

var array = ['Ext JS','Mootools','jQuery'];
var ref = array;

array.push('prototype');

console.debug(ref.length == array.length);
console.debug(ref);

Referencias sólo a objetos

Es importante mencionar que en JavaScript las referencias sólo apuntan a objetos en memoria y no a otras referencias como el lenguaje C/C++. En el siguiente ejemplo se muestra este comportamiento:

//Se crea el objeto original
var obj1 = {property:'Original value'};
//Se hace una referencia al objeto original
var ref1 = obj1;

//obj1 apunta a un Nuevo objeto
obj1 = {property:'New Object!'};

//Ref1 apunta al objeto original, por lo tanto son diferentes
console.debug('same object = '+(obj1.property == ref1.property));
console.debug(obj1.property);
console.debug(ref1.property);

Concatenación

Los strings también son objetos y hacemos referencia a estos mediante una variable; es importante recordar que cuando se concatena uno o más strings siempre resulta un nuevo objeto. En el siguiente ejemplo se muestra que al concatenar un texto se crea un nuevo string y por lo tanto la referencia queda apuntando al string original.

var str = 'Hello world!';
var refStr = str;

str += ' this is Crysfel';
console.debug('same string = '+(str === refStr));

Si tienen alguna duda o sugerencia sobre este tema de referencias, pueden hacer preguntas en los comentarios, con gusto las responderé.

22 Responses to “Referencias en JavaScript”

  • Carlos Apr 12, 2009

    muy bueno tus tutoriales sigue asi ojala sigas poniendo los demas temas que faltan saludos

  • Lestat Apr 13, 2009

    Gracias por las lecciones

    saludos

  • Franco May 01, 2009

    hola una correccion en el video muestra que declaras en la primera linea una objeto
    var obj = new Object();
    pero en el texto de la pagina esta como
    var obj = {};
    Saludos
    Franco

    • Crysfel May 03, 2009

      Así es, realmente no importa como la manera como se declare, es exactamente lo mismo, cuestión de gustos.

  • spit Jul 20, 2009

    Sigo el tuto… me esta gustado y es muy interesante…este capitulo es bastante importante porque yo estoy muy acostumbrado a programar en c++ lo cual me confunde mucho..un saludo.

  • Cristian Oct 19, 2009

    Buen detalle eso de las referencias.
    Me queda la duda si lo que se está haciendo al referencias es clonar el objeto.
    Si puedes responder y aclarármelo se lo agradecería mucho.
    Y aprovecho de felicitarte por el Tutorial que esta buenísimo.

    Saludos

    • Crysfel Oct 19, 2009

      Precizamente eso es lo que se evita al utilizar referencias, las dos variables apuntan a la misma dirección de memoria, por lo tanto las dos variables son la misma cosa, si modificas una la otra se ve modificada también.
      Saludos

  • ilen Nov 18, 2009

    PERO PARA que es la referencia?, es para cambiar el valor del objeto original… y esta a la vez en memoria?

    • Crysfel Nov 18, 2009

      Hola ilen.

      Este concepto lo debemos tener claro cuando escribimos código, ya que si no lo conocemos podríamos estar manipulando el mismo objeto sin saberlo y tendríamos errores “extraños”.

  • Claudio Madrid G. Mar 21, 2010

    Esto de la consola, no funciona en IE? hay alguna manera ?

  • micayael Aug 24, 2010

    Hola Crysfel

    Estuve mirando esto y veo solo una diferencia en el código.

    a = {var1: 1}
    b = a

    Ambos son el mismo objeto pero si vuelvo a asignarle a “b” otro objeto se vuelven diferentes. sería esto? o a que te refieres con:
    Es importante mencionar que en JavaScript las referencias sólo apuntan a objetos en memoria y no a otras referencias como el lenguaje C/C++.

    • Crysfel Aug 25, 2010

      Exactamente, a eso me refiero, si asignas un nuevo objeto a una variable la referencia sería hacia el nuevo objeto.

    • micayael Aug 30, 2010

      Genial. Muchas gracias por la aclaración.

  • Hector Rubio Oct 02, 2010

    Le felicito por este pequeño, pero gran curso inductivo, pero tengo un pequeño detalle; ¿es necesariamente obligado utiliar el FireFox?, estoy enteramente adaptado a Internet Explorer desde sus inicios y en verdad no me llama la atención instalar el FireFox, y por supuesto que las lineas de codigo: console.debug no son interpretadas por IE, para este caso ¿como serian esas sentencias?, o ¿existe alguna herramienta debug para IE, que no sea la que ya trae preinstalada?

    • Crysfel Oct 04, 2010

      En IE7 puedes usar “console.info”, en mi experiencia te comento que te cambies a firefox para desarrollar, la verdad que tiene muchas ventajas sobre Internet Explorer.

      Saludos

  • Hector Rubio Oct 02, 2010

    He aqui mi duda sobre referencias: ¿cual es el objetivo de usar referencias?, puesto que si ya declaras el objeto y esté se encuentra en memoria, ¿no es mas optimo trabajar con dicho objeto unico, en vez de redundar con un grupo de objetos para un mismo fin?, digo por que a lo mejor esto evitaria escribir codigo redundante que a la larga ocupan espacio incecesario cuando la programacion se hace extensa. Gracias

    • Crysfel Oct 04, 2010

      Es necesario conocer el concepto para evitar errores en nuestro código, el uso de referencias es algo realmente práctico y muy útil, imagina el siguiente escenario:

      Tienes un arreglo de varios elementos, luego quieres modificar algunos solamente, lo que haces es buscar el elemento, obtener una referencia del elemento en el arreglo y luego si modificas esa referencia automáticamente se modificará el que tenías en el arreglo, de esta manera ya no tienes que insertar nuevamente el elemento que habías sacado. Este es un ejemplo my sencillo, pero lo mismo aplica para estructuras más complejas como árboles, grafos, etc.

      Saludos

  • Hector I. Rubio A. Oct 04, 2010

    Saludos Crysfel;

    Ante todo te felicito por tener ese talento de querer compartir tus conocimientos de seguro te reventira en mayor conocimiento y dominio de las TIC. Tengo una pregunta mas; Hace aproximadamente 4 dias atras realice un par de preguntas y no vi tus respuestas, ¿cual es o fue la razon?, de hecho ni siquiera estan las preguntas. Gracias

    • Crysfel Oct 04, 2010

      Lo que sucede es que no había entrado al blog estos ultimos días y por lo tanto tus preguntas no estaban publicadas, no es que se borren ni nada por el estilo.

      Saludos

  • Hector I. Rubio A. Oct 04, 2010

    Saludos, muy amable de tu parte en verdad, aclarado el punto, es una buena perspectiva, con respecto a FireFox e IE, ¿pueden coexistir ambos navegadores en la Pc?, digo esto por mantener al maximo la optimización de recursos del pc, de manera de buscar agarrarle el gustico a FireFox. Gracias

    • Alvao Jiménez Oct 10, 2010

      No hay ningún problema en instalar Firefox junto con IE. De hecho puedes instalar Chrome, Opera, Safari y otros más si así lo deseas. Todos son programas que permiten ver páginas web y cada uno tiene sus propias características que los hacen ser preferidos por cada persona.
      En mi caso, normalmente navego por Chrome y para desarrollo ocupo Firefox.

  • Cristian R. Apr 24, 2011

    Hola Crysfel, tengo una duda, si yo tengo un objeto ‘a’ y después un objeto ‘b’ que hace referencia a ‘a’, entonces si ‘a’ apunta después a otro objeto, ‘b’ sigue haciendo referencia al primer objeto q apuntaba ‘a’. Con los strings lo entiendo ya q sabía que se creaban nuevos strings al tratar de concatenar, pero no se si es lo mismo con los objetos.

Leave a Reply







Updates

RSS

Subscribe to our feeds to receive updates of our newest posts and free tutorials.

Site search

Maybe we have what you need, would you like to search first?

Donations

Would you buy me a cup of coffee? I am sharing my knowledge and time with you, help this project grow. Thank you!