了解Javascript变量中的引用

时间:2016-03-22 05:46:19

标签: javascript

我有两个变量。一个是数组,另一个是表示数组元素的变量。

var arr = ['a', 'b', 'c'];

var elem = arr[1];

我相信elem是arr [1]的参考;如果这是正确的,那么我试图从arr中删除该变量,并期望elem未定义为这样的......

arr.splice(1,1);

那么elem应该是未定义的。

但不知何故,这种情况并没有发生。

任何人都可以向我解释我在哪里理解它错了或者我做错了什么?谢谢你的回答。

6 个答案:

答案 0 :(得分:1)

只有对象有引用,原始值不是。所以你只是复制了数组中的元素

答案 1 :(得分:1)

  

我相信elem是arr 1的参考;

不,不是。 JavaScript中的所有内容都是pass by value。赋值发生时的含义,例如

x = y;

右侧(在这种情况下为y)被评估为一个值,该值“复制”x

换句话说,在评估左侧之后,不知道该值是如何在第一个位置或其存储位置创建的。这就是为什么稍后更改数组不会影响分配给elem的值的副本。

这是一些ASCII艺术:

我们从两个容器(arrelem)开始。 arr包含对数组(对象)的引用。 elem是空的。

                                  +----------+              
var arr = ['a', 'b', 'c'];        |0: 'a'    |              
var elem;                         |1: 'b'    |              
                                  |2: 'c'    |              
                                  |length: 3 |              
                                  +----------+              
                                       ^                    
                                       |                    
                                       |                    
                                   |       |         |     |
                                   | #obj1 |         |     |
                                   |       |         |     |
                                   +-------+         +-----+
                                      arr             elem  

当分配发生时,右侧arr[0]被评估为一个值。评估结果是字符串'a'。该字符串放入elem

                                  +----------+              
elem = arr[0];                    |0: 'a'    |              
                                  |1: 'b'    |              
                                  |2: 'c'    |              
                                  |length: 3 |              
                                  +----------+              
                                       ^                    
                                       |                    
                                       |                    
                                   |       |         |     |
                                   | #obj1 |         | 'a' |
                                   |       |         |     |
                                   +-------+         +-----+
                                      arr              elem 

如您所见,elem与数组之间没有联系。

稍后,当数组被拼接时,它将变为:

                                  +----------+              
arr.splice(1, 1);                 |0: 'b'    |              
                                  |1: 'c'    |              
                                  |length: 2 |                        
                                  +----------+              
                                       ^                    
                                       |                    
                                       |                    
                                   |       |         |     |
                                   | #obj1 |         | 'a' |
                                   |       |         |     |
                                   +-------+         +-----+
                                      arr              elem 

因为它与elem无关,所以它没有改变。

答案 2 :(得分:0)

Splice从数组中删除了值,只要它的值在另一个引用中已经存在,它就不会删除该对象。

这与值的类型无关 - 原始或对象引用。

var arr = [{a:'a'}, {a:'b'}, {a:'c'}];
var elem = arr[1];
arr.splice(1,1);

var arr = ['a', 'b', 'c'];
var elem = arr[1];
arr.splice(1,1);

在上述两种情况中,值都将保留在elem

答案 3 :(得分:0)

数组中的每个元素都是一个内存引用,现在只是假设a,b,c指向内存引用1,2,3如果设置var x = a实际上你说x也是指向内存参考1

如果从数组中删除元素a,则只是删除指针对内存而不是元素本身x仍然指向内存,如果没有人指向则真实元素将被删除

假设每个元素都是一个对象。只有对象才是可参考的原则只是复制

答案 4 :(得分:0)

您正在分配值,而不是提供参考。

参考下面的代码,这可能会有所帮助。

QUARTER([Date Field]) &" "& YEAR([Date Field])

答案 5 :(得分:0)

在JS中,undefined除外,nullbooleanstringnumber是对象类型。它们被称为原始类型,在内存中具有固定大小。

对象类型(引用类型)不同。它可以是任何长度的不同,并且没有任何固定的大小。

原始类型和对象类型之间的差异。取自你的样本,

var arr = ['a', 'b', 'c']; //Declare and initialize an array.
var elem = arr[1]; //Copy the variable of arr[1] to a new variable
arr.splice(1,1); // Remove the arr[1]
console.log(elem); //Displays arr[1], the copy has not changed.

现在,使用对象类型

var arr = ['a', 'b', 'c']; //Declare and initialize an array.
var elem = arr; //Copy the variable of arr to a new variable
arr.splice(1,1); // Remove the arr[1]
console.log(elem); //Displays arr reference. With arr[1] has been removed.