2017-04-26 29 views
2

我想更好地了解如何通过引用传递作品有关拼接。我想有一个主要的对象数组,并使用另一个数组引用主数组对象。例如:通过引用和拼接

var mainArray = [ 
    someObject, 
    anotherObject 
] 
var subArray = []; 
subArray.push(mainArray[ 0 ]); 

我不明白的是如果我拼接原始值会发生什么?

mainArray.splice(0, 1); 

不子阵[0]:

  1. 也得到拼接?
  2. 由于有指针,它的值依然存在吗?
  3. 剩下一个空值?
+1

有**是没有**传递通过引用在JavaScript中。术语“通过引用”在编程中具有特定的含义(这是“艺术术语”):将引用*传递给变量*到函数中。 JavaScript没有。 –

+1

上面你正在做的是将一个对象引用传递给一个函数(按值,该值是对象引用)。 –

+0

不,是(但正如TJ所说,“指针”是值),没有...... – RobG

回答

4

此代码后:

var mainArray = [ 
    someObject, 
    anotherObject 
]; 
var subArray = []; 
subArray.push(mainArray[ 0 ]); 

...你有什么样的内存看起来有点像这样:

 
                +−−−−−−−−−−+ 
someObject−−−−−−−−−−−−−−−−−−+−−+−−−−−−−−−−−−−−−−−−>| (object) | 
         //     +−−−−−−−−−−+ 
          | |  
          | |      +−−−−−−−−−−+ 
          | | anotherObject−−−+−>| (object) | 
          | |    / +−−−−−−−−−−+ 
          | |    | 
      +−−−−−−−−−−−+ | |    | 
subArray−−−−>| (array) | | |    | 
      +−−−−−−−−−−−+ | |    | 
      | length: 1 | | |    | 
      | 0:  |−/ |    | 
      +−−−−−−−−−−−+ |    | 
           |    | 
       +−−−−−−−−−−−+ |    | 
mainArray−−−−>| (array) | |    | 
       +−−−−−−−−−−−+ |    | 
       | length: 2 | |    | 
       | 0:  |−−/     | 
       | 1:  |−−−−−−−−−−−−−−−−−−−−/ 
       +−−−−−−−−−−−+ 

注意,有mainArraysubArray根本没有联系。它们都恰好包含相同的值(这也是someObject中的值,所有三个地方都有同一对象的对象引用)。

去除mainArray该值对subArray(或物体)没有影响:

mainArray.splice(0, 1); 
 
                +−−−−−−−−−−+ 
someObject−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−>| (object) | 
         /      +−−−−−−−−−−+ 
          |  
          |      +−−−−−−−−−−+ 
          |  anotherObject−−−+−>| (object) | 
          |     / +−−−−−−−−−−+ 
          |     | 
      +−−−−−−−−−−−+ |     | 
subArray−−−−>| (array) | |     | 
      +−−−−−−−−−−−+ |     | 
      | length: 1 | |     | 
      | 0:  |−/     | 
      +−−−−−−−−−−−+      | 
               | 
       +−−−−−−−−−−−+     | 
mainArray−−−−>| (array) |     | 
       +−−−−−−−−−−−+     | 
       | length: 1 |     | 
       | 0:  |−−−−−−−−−−−−−−−−−−−−/ 
       +−−−−−−−−−−−+ 

所以基于这样:

1.也得到拼接?

不,更改mainArary的内容对subArray没有影响。

2.由于存在指针,该值依然存在吗?

subArray的条目值0不受影响。

3.剩下一个空值?

不,根本不影响subArray


我想更好地了解如何通过参考书相对于拼接通过。

你混淆了“参考”这个词的两个不同含义(很多人)。

“传递引用”是编程领域的术语。也就是说,它有一个特定的含义:将一个变量的变量传递给一个函数,以便该函数可以触及并更改该变量的内容。 JavaScript没有传递引用。

你在你的问题要对付的是对象引用,里面什么都没有做通,通过引用,它只是两个概念包含“参考”(但相对于完全不同的东西的话)

对象引用是值。他们告诉JavaScript引擎对象在内存中的位置。

+1

这正是我所寻找的解释。非常感谢你。 –

1

有趣的是,这与另一个最近的问题非常相似,尽管不是很愚蠢。

设置一个数据结构,试图在不同的组件中使用这样的引用来处理这个数据结构是一条黑暗的道路。如果你只是在讨论一些代码,这很有趣,但是在一个已部署的应用程序中,这很麻烦。

您最好创建一个结构,在该结构中,组件进行更改并将模型更改写入该模型,然后模型广播“脏数据”事件(或任何您想调用它的内容)包含注册侦听器(例如其他组件)正在侦听的新数据。他们收到数据有效载荷并使用它。

对于希望按需提供数据的组件,您可以注入服务/访问单例/您的框架执行的任何操作,并通过getter或某种简单工厂函数访问它。

您正在做的事情越来越多地让对象发生变化。传递有问题的对象的不可变(或至少是复制的)版本更好。这样,如果该对象发生变化,很容易找出在哪里以及为什么。如果所有事情都有实际的参考(正如你上面看到的那样,通常不会),对他们中的任何一个人的小改变都可能破坏你的早晨。

复制对象,如果你想知道,并不难。您可以复制对象只是这样(假设它包含基本对象,基本类型等)

let myNewObj = Object.assign ({}, myOldObj); 
let myNewArr = [].concat (myOldArr); 

该对象是否具有类似的事情在他们的对象等数组,你可以深深这个老把戏复制:

let myFancyObjJSON = JSON.stringify (myFancyObj) 
let copy = JSON.parse (myFancyObjJSON) 

作品绝大多数的时间,除非你的类型是不典型(如地图与符号的定义忽略了这些键的键)和其他一些未经常遇到的一天到一天的情况。

相信我,从经验,重新思考你的结构(再次,除非这只是一个实验)。

0

我已经扩大您的例子一点点地试图澄清这是怎么回事

var mainArray = [ 
 
    {a: 1}, 
 
    {b: 2} 
 
] 
 
var subArray = []; 
 
subArray.push(mainArray[ 0 ]); 
 

 
mainArray.splice(1, 1); // remove b from mainArray 
 

 
subArray[0].a = 5 // set a in subArray to 5 
 

 
console.log(mainArray, subArray); // [{a:5}] [{a:5}] a = 5 in both array (same object) 
 

 
var third = subArray; 
 

 
third[0].a = 15; 
 

 
console.log(mainArray, subArray, third); // [{a:15}] [{a:15}] [{a:15}] 
 
             // the same object a is changed everywhere 
 

 
third.splice(0, 1); 
 

 
console.log(mainArray, subArray, third); // [{a:15}] [] [] 
 
             // mainArray ---> object x ---> x[0] ---> a 
 
             // third and subArray ---> object y ---> y[0] ---> a 
 
             // there's no link between x and y directly