【问题标题】: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】:

          我带着同样的问题来到这里。尽管包装器答案有效,但它很难看,而且我的函数是异步的,所以我不能返回空值。

          我希望onull 的原因是后来我使用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));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-04-24
              • 2011-09-03
              • 2010-12-27
              • 1970-01-01
              • 2011-11-25
              • 2016-02-06
              • 2016-01-29
              相关资源
              最近更新 更多