¿Hay punteros en javascript?
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?
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
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).
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.
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})