Javascript 变量作为对象指针
Posted
技术标签:
【中文标题】Javascript 变量作为对象指针【英文标题】:Javascript Variables as Object Pointers 【发布时间】:2013-07-26 04:33:45 【问题描述】:出于好奇,我有一个问题。所以我研究了 JS 如何处理变量赋值,我明白了。 How does variable assignment work in javascript?
但在我正在处理的以下代码中似乎没有表现出相同的原则:
var temp = playlist1[0];
playlist1[0] = playlist1[1];
playlist1[1] = temp;
我知道这是交换数组元素的标准方法。但是如果 temp 指向playlist1[0]
,而playlist1[0]
的内容更改为playlist1[1]
的内容,那我怎么没有连续两个playlist1[1]
值呢?
【问题讨论】:
How does variable assignment work in JavaScript?的可能重复 我将其投票为重复,因为您链接的问题中的答案就是您问题的答案。 @EvanTrimboli 我认为这个问题是公平的,因为它要求对现有问题进行进一步澄清。另一个问题很老,可能不再受到监控。 旧与否,答案都是一样的。 OP 辩称,他提出这个问题是为了进一步理解该主题。经过初步解释(不是来自“已经知道”的地方),链接的问题没有清楚地回答问题。在最终解释后(来自“已经知道”的地方),OP 会看到链接的问题如何提供帮助;作为参考文本而不是学习文本。但是 OP 坚持认为这个问题增加了链接问题的价值并加深了学习,以避免可能将变量误解为对象指针概念。 【参考方案1】:不仅变量是对象指针。 所有值(不是原始值)都是对象指针。所以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;
【讨论】:
OP 的要点:数组元素不是对象,它们也是指向对象的指针。这回答了我的问题,加深了我对机制的理解。【参考方案2】:这与引用问题中的答案一致: 您只是在更改变量指向的对象 - 而不是它曾经指向的数据。这意味着 temp 不受将 playlist1[1] 指向 playlist1[2] 的移动的影响。当 playlis1[1] 和 temp 都指向它时,Temp 保留它指向的原始值。仅更新播放列表 1[1]
【讨论】:
【参考方案3】:因为这些仍然是对数组中元素的引用,而不是元素本身。所以在这一行:
playlist[1]=playlist[2]
你没有改变任何关于 temp 的东西。与类似的东西(假设数组元素是对象)进行对比:
playlist[1].x=playlist[2].x
这实际上是给数组中的对象赋值,如果temp指向playlist[1],那么temp.x就等于playlist[2].x
【讨论】:
【参考方案4】:假设我们有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
【讨论】:
以上是关于Javascript 变量作为对象指针的主要内容,如果未能解决你的问题,请参考以下文章