JavaScript变量作为对象指针

9

我有一个好奇的问题,所以我研究了一下JS如何处理变量赋值并且我明白了。JavaScript中的变量赋值是如何工作的?

但是同样的原理似乎在我正在处理的以下代码中并没有体现出来:

var temp = playlist1[0];
playlist1[0] = playlist1[1];
playlist1[1] = temp;

我知道这是一种交换数组元素的标准方法。但是如果temp指向playlist1[0],并且playlist1[0]的内容更改为playlist1[1]的内容,那么为什么最终不会出现两个playlist1 [1]值?


可能是JavaScript中变量赋值的工作原理是什么?的一个重复问题。 - Evan Trimboli
我将此标记为重复,因为您链接的问题中的答案就是您问题的答案。 - Evan Trimboli
@EvanTrimboli 我认为这个问题是公平的,因为它要求对现有问题进行进一步澄清。另一个问题已经过时,可能不再受到监控。 - TGH
无论新旧,答案都是一样的。 - Evan Trimboli
1
OP认为他提出这个问题是为了进一步理解这个主题。在最初的解释(不是来自“已经知道”的地方)中,链接的问题并没有清楚地回答这个问题。在最终的解释(来自“已经知道”的地方)中,OP看到链接的问题可能会有所帮助;作为参考文本而不是学习文本。但是OP坚持认为,这个问题为链接的问题增加了价值,并深化了学习,以避免将变量误解为对象指针概念。 - nemo
4个回答

12

不仅变量是对象指针。所有的值(除了基本类型)都是对象指针。所以temp是一个对象指针。playlist1是指向数组对象的对象指针,其元素也是对象指针。例如:playlist1[0]是一个对象指针,playlist1[1]是一个对象指针等等。

但是如果temp指向playlist1[0]

这没有意义。 temp是一个对象指针。它指向一个对象。playlist1[0]不是一个对象;它是一个对象指针。 temp = playlist1 [0];使对象指针temp指向与对象指针playlist1[0]相同的对象。

如果您了解C语言,则类似于以下内容:

Object *playlist1[10];

Object *temp = playlist1[0];
playlist1[0] = playlist1[1];
playlist1[1] = temp;

1
楼主的收获:数组元素不是对象,它们也是指向对象的指针。这回答了我的问题,并加深了我对机制的理解。 - nemo

2
这与被引用问题中的答案一致: 您只是更改变量指向的对象 - 而不是它曾经指向的数据。这意味着temp不受移动playlist1 [1]指向playlist1 [2]的影响。当playlis1 [1]和temp都指向它时,temp保留了原始值。只有playlist1 [1]被更新。

0

因为它们仍然是对数组中元素的引用,而不是元素本身。所以在这一行中:

playlist[1]=playlist[2]

你没有改变temp的任何内容。与之形成对比的是(假设数组元素是对象):

playlist[1].x=playlist[2].x

这实际上是将数组中对象的值赋给了变量,如果temp指向playlist [1],那么temp.x将等于playlist [2] .x


0
假设我们有一个对象 obj={l1:{l2:[1,2]},},我们想要使用层级数组 arr=["l1","l2",1] 来访问 obj.l1.l2[1],那么代码如下:
Object.defineProperty(Object.prototype,'point',{
    value:function(arr){
        var rez=this;
        for(var s in arr){
            rez=rez[arr[s]];
            if(rez === undefined) return undefined;
        }
        return rez;
    }
});

所以在定义“point”方法之后(该方法不可枚举以避免混乱),我们可以使用

obj.point(arr)

获取值为2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接