JavaScript shift()方法是否返回元素的引用或副本?

时间:2013-04-22 21:35:32

标签: javascript reference pass-by-reference

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

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 变量吗?

2 个答案:

答案 0 :(得分:1)

答案:这是元素的(副本)。但是元素是什么?与Java类似,JavaScript中的每个值都是基元或引用(指向对象的指针)。 “对象”不是JavaScript中的值。对象只能通过引用(指向对象的指针)进行操作。

  

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

     

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

     

我将它们放在一个数组中

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

  

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

firstElementobj1的副本,是一个参考。如果更改firstElement指向的对象的某些属性,那么当然可以通过obj1看到它,因为它们指向同一个对象。

答案 1 :(得分:-1)

参考,请查看此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;