如何知道两个 JavaScript 变量指向同一内存地址

22

有没有一种方法可以知道两个 JavaScript 变量指向相同的内存地址?

var my_var = {
    id: 1,
    attribute: "myAttribute"
}

var copy = my_var;

//someting like
if(copy === my_var) return true;

8
好的,你已经回答了自己的问题。 :) 这只适用于物体。 - freakish
"===" 表示两个变量具有相同的类型,在您的情况下是 Object,这将为 true。这不会检查相同的内存分配。 - antyrat
这也意味着它们是同一个对象。我不知道在这种情况下有哪个JS引擎会有两个单独的内存分配。 - OrangeDog
2
@antyrat 不是的,===检查类型值。如果两边都是对象,则检查它们是否指向相同的地址。就是这样。 - freakish
1
@antyrat 这是严格相等。它们必须是相同类型并且具有相同的值。对于对象而言,“具有相同的值”与“是相同的对象”是同义词,这意味着它们占用相同的内存地址。 - Anthony Grist
显示剩余5条评论
4个回答

20

在JavaScript中,您不能像在C语言中那样使用别名变量。

var x = 1;
var y = x
y = 4;
// x is still 1

这将始终如此。

然而,对象始终按引用传递。

var x = { one: 1, two: 2 };
var y = x;
y.one = 100;
// x.one is now 100

1
-1:对于对象,“相等”意味着“具有相同的内存引用”。 - freakish
你说得对,我已经从帖子中删除了它,因为我认为上面的解释更好。 - bendecoste
同时,第一段代码在C中也会产生相同的结果。实际上,变量赋值在JavaScript和C中的工作方式是完全相同的。区别在于:1)将变量传递给函数,2)JavaScript中没有引用/指针运算符(即无法直接使用内存)。 - freakish
(点赞)我想我应该包括一个带有指针操作的C示例,它们被排除在外,因为JavaScript没有它们...措辞有点不清楚,我想。 - bendecoste

20

有没有办法知道2个 JavaScript 变量指向同一个内存地址?

一般来说,答案是不行的。原始类型(如数字)通过值传递。所以我们有:

> var x = 1;
> var y = 1;
> x === y;
true

即使它们不引用同一内存位置(这是一个实现细节,但至少在V8中它们不指向相同的内存地址)。

但是当两边都是对象时,是的:使用=====。如果两边都是对象,则每个运算符检查它们是否指向相同的内存地址。

> var x = {test: 1};
> var y = {test: 1};
> x === y;
false

在第一个例子中,x和y指向同一个1吗? - MartianMartian
1
@Matian2049 指的是在相同的内存地址上吗?这是一项实现细节,取决于您使用的 JavaScript 引擎。例如,在 V8(Chrome 的 JS)下,答案是否定的:这是因为原始类型存在于堆栈中。 - freakish
感谢及时回答。这就是我的意思,如果1和1共享同一个内存地址。现在清楚了。 - MartianMartian
所以我正在和自己争论。当变量a = 1; 变量b = a;时,是将1复制到b还是指向为a创建的第一个1? - MartianMartian
1
@Matian2049 已经复制了。试试这个:var a = 1; var b = a; a = 2; console.log(b); 它会输出 1 - freakish
有趣的是,如果a指向1,那么b也指向1,a重新指向2,但b仍然指向1。看起来我已经创造了一个镜像逻辑世界..哈哈,谢谢你的帮助。 - MartianMartian

0
在JavaScript中,当我们声明多个具有相同值的变量时,每个变量都指向相同的内存位置。基本上,JavaScript遵循引用计数算法。Python中也会发生同样的事情。

如何通过程序证明“每个变量都指向同一内存位置”? - Mehraj Malik

-6
在Python中,您可以使用id(variableName)来获取内存地址:
>>> x = "hello world"
>>> id(x)
4347327152
>>> x = 2
>>> id(x)
4305328544

但是我不知道如何在JavaScript中实现它。否则,我们也可以很容易地看到两个指针是否指向相同的地址。希望我的答案提供了一些有用的信息。

7
这正是我想要找的,其他答案都没有帮助!我需要一个 JavaScript 版本的 Python id 内置函数。 - temporary_user_name
2
我不认为这个答案应该受到如此多的仇恨。对于所有投票反对的人来说,这个答案可能会为那些在寻找类似Javascript的东西的人提供一个合适的搜索方向。 - Luillyfe
在Python中,当你执行x = 1然后x = y时,xy共享相同的内存地址引用。我仍然不明白JavaScript是否也会发生这种情况。 - viery365
对于所有投反对票的人,请至少给出一个理由。 - Himanshu
@Himanshu 显然,这个回答并没有回答问题。"可以用Python完成,但不确定JavaScript是否可以"更像是一个可以接受的评论,而不是一个答案。 - Mathews Mathai
@Himanshu 这是因为问题涉及到 JavaScript,而答案则是关于 Python 的。 - David Lui

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