He usado C++ antes y me di cuenta de que los punteros fueron muy útiles. Hay algo en javascript que actúa como un puntero? Hace javascript punteros? Me gusta usar los punteros cuando quiero usar algo como:

var a = 1;
var b = "a";
document.getElementById(/* value pointed by b */).innerHTML="Pointers";

Sé que este es un muy sencillo ejemplo y yo sólo podría utilizar a, pero hay varios ejemplos más complejos donde me iba a encontrar punteros muy útil. Alguna idea?

  • Mmh… no deberías generalmente necesitan de punteros. Puede usted dar una más del mundo real ejemplo de un caso que he encontrado donde punteros sería útil?
  • Posibles duplicados de Punteros en JavaScript?

5 Comentarios

  1. 61

    No, JS no tiene punteros.

    Objetos se pasan todo por el paso de una copia de una referencia. El programador no se puede acceder a cualquier C-como «valor» que representa la dirección de un objeto.

    Dentro de una función, se puede cambiar el contenido de un objeto pasado a través de esa referencia, pero no puede modificar la referencia que el autor de la llamada tenía, porque su referencia es sólo una copia:

    var foo = {'bar': 1};
    
    function tryToMungeReference(obj) {
        obj = {'bar': 2};  //won't change caller's object
    }
    
    function mungeContents(obj) {
        obj.bar = 2;       //changes _contents_ of caller's object
    }
    
    tryToMungeReference(foo);
    foo.bar === 1;   //true - foo still references original object
    
    mungeContents(foo);
    foo.bar === 2;  //true - object referenced by foo has been modified
    • ¿Qué es un copia de una referencia, puede ser utilizado como punteros y cómo puedo utilizarlo?
    • ver actualización para responder
    • La referencia es el nombre del objeto, la copia es básicamente un nombre nuevo apuntando a la misma dirección
    • ¿Cuál es la .bar para?
    • es sólo un marcador de posición para representar el objeto del contenido, como se opuso a la referencia al objeto en sí mismo.
    • Oh. Lo tengo ahora. Muchas gracias.

  2. 29

    Usted apuesta no hay punteros en JavaScript; los objetos son punteros.

    //this will make object1 point to the memory location that object2 is pointing at
    object1 = object2;
    
    //this will make object2 point to the memory location that object1 is pointing at 
    function myfunc(object2){}
    myfunc(object1);

    Si una ubicación de memoria ya no se señalen los datos no se perderán.

    A diferencia de C, que usted no puede ver la dirección real del puntero ni el valor real de el puntero, sólo puede eliminar la referencia (obtener el valor en la dirección a la que apunta.)

    • La 1ª parte funciona al 100%. El var objeto1 es sólo apunta a objeto2. Si cambiamos el objeto1, objeto2 cambios de la realidad. El cambio de objeto2 directamente también muy bien muestra cuando revisamos el contenido de objeto1. Se mostrará que el objeto1 es también cambió, YA QUE los PUNTOS A LOS MISMOS DATOS EN la MEMORIA. He probado esto. No entiendo la 2ª parte, pero no importa.
    • Javascript es una especie de gracioso acerca de pasar objetos a funciones. Si la función se altera uno de los miembros de un objeto en un momento se pasa por referencia. Sin embargo, Si se intenta cambiar el objeto por completo el uso de llaves, parece que se pasa por valor. Supongo que esto es debido a que Javascript automáticamente piensa que usted está creando un nuevo objeto al hacer = {…}, básicamente haciendo una variable local que pasa a tener el mismo nombre que el parámetro.
    • Realmente no se trata de crear un nuevo objeto, como se dice explícitamente. Aprendí que es acerca de pasar la referencia de siempre: al hacer objX = {..} realmente se pasa la referencia a un objeto recién creado. Al hacer objX = objY, luego de pasar de la referencia a un objY objeto de que ya existía. Pero la = realidad siempre se pasa la dirección donde el objeto a la derecha del operador de asignación reside (no importa si es nueva o una ya existente – el lado derecho del operador de asignación resuelve primero).
    • Buen punto! Después de algunas pruebas he aprendido más, es, de hecho, siempre se pasan por referencia, tenga cuidado de no cambiar su dirección.
  3. 0

    debido a la naturaleza de JS que pasa objetos de valor (si el objeto de referencia es cambiado por completo) o por referencia (si el campo del objeto de referencia se cambia) no es posible reemplazar completamente un objeto de referencia.

    Sin embargo, vamos a utilizar lo que está disponible: la sustitución de los campos individuales de los objetos referenciados. Al hacer eso, la siguiente función permite conseguir lo que usted está pidiendo:

    function replaceReferencedObj(refObj, newObj) {
        let keysR = Object.keys(refObj);
        let keysN = Object.keys(newObj);
        for (let i = 0; i < keysR.length; i++) {
            delete refObj[keysR[i]];
        }
        for (let i = 0; i < keysN.length; i++) {
            refObj[keysN[i]] = newObj[keysN[i]];
        }
    }

    Para el ejemplo dado por user3015682 se puede usar esta función como la siguiente:

    replaceReferencedObj(foo, {'bar': 2})
  4. -3

    Intente esto:

    //MaybePointer Lib
    function MaybePointer(v){
        this.val = v;
    }
    MaybePointer.prototype.valueOf = function(){ return this.val };
    
    //Your code
    var a = new MaybePointer(1);
    var b = a;
    document.getElementById(b+'').innerHTML="Pointers 1";
    
    var c = new MaybePointer(2);
    var b = c;
    document.getElementById(b+'').innerHTML="Pointers 2";
    <div id="1"></div>
    <div id="2"></div>
  5. -7

    Técnicamente JS no tiene punteros, pero he descubierto una manera de imitar su comportamiento 😉

    var car = {
        make: 'Tesla',
        nav: {
           lat: undefined,
           lng: undefined
        }
    };
    
    var coords: {
        center: {
           get lat() { return car.nav.lat; }, //pointer LOL
           get lng() { return car.nav.lng; }  //pointer LOL
        }   
    };
    
    car.nav.lat = 555;
    car.nav.lng = 777;
    
    console.log('*** coords: ', coords.center.lat); //555
    console.log('*** coords: ', coords.center.lng); //777
    • Te acabo de volver de las propiedades de la car. No tiene nada que ver con punteros o imitar y es conocido como el scope

Dejar respuesta

Please enter your comment!
Please enter your name here