2012-02-09 15 views
7

Me pregunto si esto es posible. Básicamente tengo un par de objetos que paso a una función, y bajo ciertas condiciones quiero que esa función establezca el objeto como nulo.JavaScript - ¿Cómo/Puedo establecer una referencia de objeto a nulo desde una función?

Ej.

var o = {'val' : 0}; 

f = function(v) 
{ 
    v = null; 
}; 

f(o); // Would like this to set 'o' to null 

Desafortunadamente, parece que solo puedo establecer el argumento de la función en nulo. Después de llamar a la función 'o' todavía se referirá a un objeto.

Entonces, ¿es posible hacerlo? Y si es así, ¿cómo?

Respuesta

7

Si desea cambiar el valor de o cuando f(o) se llama, tiene dos opciones :

1) Usted puede tener f(o) devolver un nuevo valor para asignar o y que a O como esto:

var o = {'val' : 0}; 
o = f(o); 
// o == null 

Dentro de f(), devuelve un nuevo valor para o.

function f(v) { 
    if (whatever) { 
     return(null); 
    } 
} 

2) Se ponen o en otro objeto y pasa una referencia a ese objeto contenedor en f().

function f(v) { 
    if (whatever) { 
     v.o = null; 
    } 
} 

var c = {}; 
c.o = {'val' : 0}; 

f(c); 
// c.o == null; 

El lenguaje Javascript no tiene verdaderos punteros como en C/C++ que le permiten pasar un puntero a una variable y luego llegar de nuevo a través de ese puntero para cambiar el valor de esa variable dentro de la función. En cambio, tienes que hacerlo de una de estas otras dos formas. Los objetos y matrices se pasan por referencia para que pueda volver al objeto original desde la función.

2

No estoy seguro exactamente de la utilización real de este, pero si reestructurado un poco, usted puede hacer esto:

var o = {'val' : 0}; 

var f = function(v) 
{ 
    if(something){ 
     return null; 
    }else{ 
     return v; 
    } 
}; 

o = f(o); 
2

JavaScript siempre pasa los argumentos de la función "por valor". Lo que significa que una función no puede cambiar a qué apunta la variable fuera de la función.

Sin embargo, cuando pasa un objeto a una función, el "valor" que se pasa es una referencia al objeto real, no una copia del objeto. Entonces, aunque no puede establecer la variable externa como nula o para otro objeto, puede modificar el contenido de ese objeto. Lo que significa que puede hacer algo como esto:

var containerObj = {'o' : {'val' : 0} }; 

f = function(v) { 
    v.o = null; 
}; 

f(containerObj.o); // This property would be set to null successfully. 

creando Obviamente un montón de objetos contenedores sólo para que pueda pasarlos a funciones no es muy bonito, pero es una manera de hacerlo.

Pero recomiendo ir con la sugerencia de James Montagne de hacer que la función devuelva un objeto o nulo y asignarle el resultado a su variable.

1

Vine aquí con el mismo problema. Aunque la respuesta contenedora funciona, es fea y mi función es asincrónica, por lo que no puedo devolver un valor nulo.

La razón por la que quería ser onull es que luego utilizo if (o) //do something, lo que podría ser la razón por la OP y otros quieren establecerlo como null.Como tal, mi solución, aunque no es una respuesta a la pregunta exacta, era

var o = {'val' : 0}; 
f = function(v) { 
    v.isNull = true; 
} 
if (!o.isNull) // do something 
0

La forma más sencilla de hacerlo sería crear una variable global llamada NULL y configurarlo para anular

var NULL = null 

Luego puede establecer una variable existente en NULL sin modificar el objeto original.

var NULL = null; 
var original = {}; 
var ptr = original; 
ptr = NULL; 
console.log("original is not null = " + (original!==null)); 
console.log("ptr is null = " + (ptr===null)); 
Cuestiones relacionadas