9

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

但是在我正在处理的以下代码中似乎没有表现出相同的原则:

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

我知道这是交换数组元素的标准方法。但是,如果 temp 指向playlist1[0],并且playlist1[0]'s 的内容被更改为playlist1[1]'s 那么我为什么没有playlist1[1]连续两个值结束呢?

4

4 回答 4

12

不仅变量是对象指针。所有值(不是原始值)都是对象指针。temp对象指针也是如此。playlist1是指向其元素是对象指针的数组对象的对象指针。egplaylist1[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;
于 2013-07-26T05:40:51.870 回答
2

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

于 2013-07-26T03:20:54.437 回答
0

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

playlist[1]=playlist[2]

你没有改变任何关于温度的东西。将其与类似的东西(假设数组元素是对象)进行对比:

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

这实际上是在数组中分配对象的值,如果 temp 指向 playlist[1],则 temp.x 将等于 playlist[2].x

于 2013-07-26T03:39:25.600 回答
0

假设我们有 obj={l1:{l2:[1,2]},}并且我们想obj.l1.l2[1]使用一系列级别来解决,例如arr=["l1","l2",1]then :

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;
    }
});

因此,在定义“点”方法(不可枚举以搞砸一切)之后,我们可以使用

obj.point(arr)

获得价值 2

于 2015-09-11T10:42:22.753 回答