¿Hay punteros en javascript?

Resuelto Dylan Vander Berg asked hace 11 años • 7 respuestas

Usé C++ antes y me di cuenta de que los consejos eran muy útiles. ¿Hay algo en JavaScript que actúe como un puntero? ¿Javascript tiene punteros? Me gusta usar 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 ejemplo extremadamente simple y podría usarlo a, pero hay varios ejemplos más complejos en los que encontraría sugerencias muy útiles. ¿Algunas ideas?

Dylan Vander Berg avatar Jun 29 '13 23:06 Dylan Vander Berg
Aceptado

No, JS no tiene sugerencias.

Los objetos se transmiten pasando una copia de una referencia . El programador no puede acceder a ningún "valor" similar a C que represente la dirección de un objeto.

Dentro de una función, uno puede cambiar el contenido de un objeto pasado a través de esa referencia, pero no puede modificar la referencia que tenía la persona que llama porque su referencia es solo 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
Alnitak avatar Jun 29 '2013 16:06 Alnitak

Puedes apostar que 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 ya no se señala una ubicación de memoria, los datos allí se perderán.

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

user3015682 avatar May 12 '2015 04:05 user3015682

Acabo de hacer algo extraño que también funciona.

En lugar de pasar un puntero, pase una función que complete su argumento en la variable de destino.

var myTarget;

class dial{
  constructor(target){
    this.target = target;
    this.target(99);
  }
}
var myDial = new dial((v)=>{myTarget = v;});

Esto puede parecer un poco perverso, pero funciona bien. En este ejemplo, creé un dial genérico, al que se le puede asignar cualquier objetivo en forma de esta pequeña función "(v)=>{target = v}". No tengo idea de qué tan bien funcionaría en términos de rendimiento, pero funciona de maravilla.

Timur Baysal avatar Apr 08 '2021 03:04 Timur Baysal

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

Sin embargo, usemos lo que está disponible: reemplazar campos individuales de objetos referenciados. Al hacer eso, la siguiente función permite lograr lo que estás 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 el usuario3015682, usaría esta función de la siguiente manera:

replaceReferencedObj(foo, {'bar': 2})
Toshiro99 avatar Jun 14 '2019 08:06 Toshiro99