【问题标题】:Pass by reference and value in javascript / jquery在 javascript / jquery 中通过引用和值传递
【发布时间】:2014-12-02 02:46:12
【问题描述】:

我有一个测试用例如下:

$(document).ready(function() {
   var arrayList=[{"name":"pradip"},{"name":"Tengi"}];
   var del = function(list) {
      list.splice(1,1);
      $("div").append("function:" + list.length +"<br>"); 
   };
   $("div").append("original:" + arrayList.length+"<br>");
   del(arrayList);
   $("div").append("modified"+ arrayList.length+"<br>");

   var test=1;
   var increase=function(a){
      a++;
      $("div").append("function="+a+"<br>");
   }
   $("div").append("original test="+test+"<br>");
   increase(test);
   $("div").append("increased test="+test+"<br>"); 
});

输出是:

original:2
function:1
modified1
original test=1
function=2
increased test=1

当我将数组按值传递给函数时,在函数中我更改了值,更改也反映在原始数组中,但在其他情况下,没有任何更改。

JSFiddle

为什么按值传递就像是通过引用传递数组一样?

【问题讨论】:

标签: javascript jquery pass-by-reference pass-by-value


【解决方案1】:

您正在按值传递对数组的引用。

您现在有两个对同一个数组实例的引用。

如果你不想改变数组,你需要显式地创建一个副本。

【讨论】:

    【解决方案2】:

    如果传递的参数是原始类型,例如 (string ,number) 然后创建传递参数的副本(在函数调用完成时销毁)这意味着按值传递

    但如果 传递的参数一个对象一个数组 那么我们有 passage by 参考

    这是一个例子

    num = 10;
    str = 'string';
    arr = [1,2,3]
    obj = {p1:'val1'}
    
    function passedBy(arg1){
      if(typeof arg1 === 'object'){
        // we are in the case where arg1 can be an object or an array 
           if(arg1.constructor === Array){
              // add 1 to the passed array 
              arg1.push(1);
           }else{
               // add p2 property to the passed object
               arg1.p2 = 'val2';
    
          }
    
      }else{
          //here arg1 parameter is a string or a number
          // if arg1 is a string the following instruction should perform a concatenation     
          // operation instead it should add 1 to arg1
          arg1 +=1 
      }
    
    }
    

    现在你可以试试这个简单的功能,看看引用通道和值通道之间的区别

    例如

    passedBy(num);  
    passedBy(str); 
    console.log(num);
    console.log(str);
    

    我们可以很容易地看到 strnum 的值没有改变,即使我们在 passBy() 函数中修改了它们

    但如果我们尝试

    passedBy(arr);
    passedBy(obj);
    console.log(arr);
    console.log(obj);
    

    我们可以清楚地看到 arrobj 的内容与最初的不一样

    希望你得到它

    【讨论】:

    • 不,JavaScript 中没有引用传递。
    • 尝试将对象传递给函数并在函数内部尝试修改对象(例如添加新属性),然后尝试显示旧对象(作为参数传递的对象),您将获得一个添加到初始对象的新属性,你怎么称呼它?
    • 这是按值传递。您不能在 JavaScript 中“传递对象”。对象不是 JavaScript 中的值。 JavaScript 中唯一的类型是原语和引用(指向对象的指针)。您正在按值传递指针。和Java完全一样,都是传值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2011-12-06
    相关资源
    最近更新 更多