我有两个变量。一个是数组,另一个是表示数组元素的变量。
var arr = ['a', 'b', 'c'];
var elem = arr[1];
我相信elem是arr [1]的参考;如果这是正确的,那么我试图从arr中删除该变量,并期望elem未定义为这样的......
arr.splice(1,1);
那么elem应该是未定义的。
但不知何故,这种情况并没有发生。
任何人都可以向我解释我在哪里理解它错了或者我做错了什么?谢谢你的回答。
答案 0 :(得分:1)
只有对象有引用,原始值不是。所以你只是复制了数组中的元素
答案 1 :(得分:1)
我相信elem是arr 1的参考;
不,不是。 JavaScript中的所有内容都是pass by value。赋值发生时的含义,例如
x = y;
右侧(在这种情况下为y
)被评估为一个值,该值“复制”到x
。
换句话说,在评估左侧之后,不知道该值是如何在第一个位置或其存储位置创建的。这就是为什么稍后更改数组不会影响分配给elem
的值的副本。
这是一些ASCII艺术:
我们从两个容器(arr
和elem
)开始。 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
除外,null
,boolean
,string
和number
是对象类型。它们被称为原始类型,在内存中具有固定大小。
对象类型(引用类型)不同。它可以是任何长度的不同,并且没有任何固定的大小。
原始类型和对象类型之间的差异。取自你的样本,
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.