【问题标题】:Does JavaScript shift() method returns reference or copy of the element?JavaScript shift() 方法是否返回元素的引用或副本?
【发布时间】:2013-04-15 22:43:21
【问题描述】:

假设我有这样声明的树对象:

var obj1 = new Car();
var obj2 = new Car();
var obj3 = new Car();

我把它们放在一个数组中

var myArray = [];
myArray.push(obj1);
myArray.push(obj2);
myArray.push(obj3);

最后,如果我这样做:

var firstElement = myArray.shift();

这让我想知道:

firstElement 是对 obj1 的引用还是它的副本?例如,如果我更改 firstElement 的某些属性,它会影响 obj1 变量吗?

【问题讨论】:

  • 如果它是一个对象,它就是一个引用的副本。但是你推送的只是undefined,因为你还没有创建任何对象。
  • 嗯,你是对的!我会解决的!

标签: javascript reference pass-by-reference


【解决方案1】:

答案:它是元素的(副本)。但是元素是什么?与 Java 一样,JavaScript 中的每个值要么是原始值,要么是引用(指向对象的指针)。 “对象”不是 JavaScript 中的值。对象只能通过引用(指向对象的指针)来操作。

假设我有这样声明的树对象:

var obj1 = new Car(); var obj2 = new Car(); var obj3 = new Car();

我把它们放在一个数组中

没有。您实际上有三个引用(指向对象的指针),它们指向您创建的对象。您将这些引用放入数组中。

firstElement 是对 obj1 的引用还是它的副本?例如 如果我更改 firstElement 的某些属性会影响 obj1 变量?

firstElementobj1 的副本,一个引用。如果你改变了firstElement所指向的对象的某些属性,那么它当然可以通过obj1可见,因为它们指向同一个对象。

【讨论】:

    【解决方案2】:

    作为参考,请查看此 jsfiddle 以获取证据:

    http://jsfiddle.net/3wntu/1/

    HTML:

    <div >Shifted obj title: <span  id='display1'></span></div>
    <div >firstObj title: <span  id='display2'></span></div>
    <div >obj1 title: <span  id='display3'></span></div>
    

    js:

    var myArray = [],
        firstElement = {},
        obj1 = {title:'obj1'},
        obj2 = {title: 'obj2'},
        obj3 = {title: 'obj3'};
    
    myArray.push(obj1);
    myArray.push(obj2);
    myArray.push(obj3);
    
    firstElement = myArray.shift();
    
    document.getElementById("display1").innerHTML = firstElement.title;
    
    //change the objects name
    firstObj.title = "firstElement";
    
    //output the reference object title
    document.getElementById("display2").innerHTML = firstElement.title;
    
    //output the original output - should be the same as the altered reference title
    document.getElementById("display3").innerHTML = obj1.title;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2011-12-29
      • 2011-01-20
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多