【问题标题】:JavaScript - How/Can I set an object reference to null from a function?JavaScript - 如何/我可以从函数中将对象引用设置为 null 吗?
【发布时间】:2012-03-01 13:57:45
【问题描述】:
我想知道这是否可能。基本上我有几个对象传递给一个函数,并且在某些条件下我希望该函数将对象设置为 null。
例如
var o = {'val' : 0};
f = function(v)
{
v = null;
};
f(o); // Would like this to set 'o' to null
不幸的是,我似乎只能将函数的参数设置为 null。调用函数后,'o' 仍然会引用一个对象。
那么,有可能做到这一点吗?如果有,怎么做?
【问题讨论】:
标签:
javascript
function
object
pointers
reference
【解决方案1】:
如果您想在调用f(o) 时更改o 的值,您有两种选择:
1) 您可以让f(o) 为 o 返回一个新值并将其分配给 o,如下所示:
var o = {'val' : 0};
o = f(o);
// o == null
在f() 内部,您为o 返回一个新值。
function f(v) {
if (whatever) {
return(null);
}
}
2) 您将 o 放入另一个对象并将对该容器对象的引用传递给 f()。
function f(v) {
if (whatever) {
v.o = null;
}
}
var c = {};
c.o = {'val' : 0};
f(c);
// c.o == null;
javascript 语言没有像 C/C++ 中那样的真正指针,它允许您将指针传递给变量,然后通过该指针返回以从函数内更改该变量的值。相反,您必须使用其他两种方式之一。对象和数组通过引用传递,因此您可以从函数返回到原始对象。
【解决方案2】:
JavaScript 总是“按值”传递函数参数。这意味着函数不能改变函数外的变量所指向的内容。
但是,当您将对象传递给函数时,传递的“值”是对实际对象的引用,而不是对象的副本。因此,尽管您不能将外部变量设置为 null 或另一个对象,但您可以修改该对象的内容。这意味着您可以执行以下操作:
var containerObj = {'o' : {'val' : 0} };
f = function(v) {
v.o = null;
};
f(containerObj.o); // This property would be set to null successfully.
显然,创建一堆容器对象只是为了将它们传递给函数并不是很漂亮,但这是一种方法。
但我建议采用 James Montagne 的建议,让函数返回一个对象或 null 并将结果分配回您的变量。
【解决方案3】:
不确定它的真正用途,但如果你稍微调整一下,你可以这样做:
var o = {'val' : 0};
var f = function(v)
{
if(something){
return null;
}else{
return v;
}
};
o = f(o);
【解决方案4】:
我带着同样的问题来到这里。尽管包装器答案有效,但它很难看,而且我的函数是异步的,所以我不能返回空值。
我希望o 为null 的原因是后来我使用if (o) //do something,这可能是OP 和其他人想要将其设置为null 的原因。因此,我的解决方案虽然不是确切问题的答案,但
var o = {'val' : 0};
f = function(v) {
v.isNull = true;
}
if (!o.isNull) // do something
【解决方案5】:
最简单的方法是创建一个名为 NULL 的全局变量并将其设置为 null
var NULL = null
然后您可以将现有变量设置为 NULL,而无需修改原始对象。
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));