我有一些关于在 JavaScript 中将变量设置为等于另一个变量的问题。
假设我们创建一个对象,a
并设置b = a
.
var a = {
fname: "Jon",
lname: "Smith",
age: 50
}
var b = a;
我明白如果我们改变其中之一a
的属性b
也会改变,因为当我们设置b = a
我们不克隆a
的数据,而是创建对的引用a
的数据。例如如果我们设置a.fname = "Sarah"
,新值b.fname
将"Sarah"
.
如果我们尝试“清除”a
虽然通过设置a = {}
, 目的b
将保持不变。我不明白为什么以这种方式操作对象会产生与第一个示例不同的结果。
我对以下场景也有疑问。
var x = 10;
var z = x;
如果我们然后设置x = 20
, 的价值z
保持不变。根据我的第一个问题中描述的行为,人们会认为z
将反映新的价值x
。有人可以解释一下我在这里缺少什么吗?
谢谢你!
对你的两个问题的真正简短的回答是,当你使一个变量等于另一个变量时,复制第一个变量中的内容并将其存储在第二个变量中- 两个变量之间没有联系。
但是,请继续阅读以了解更多详细信息以及为什么在某些情况下似乎存在链接......
JavaScript 与许多语言一样,将数据分为两大类:值类型和引用类型。 JavaScript 值类型有它的原语 https://developer.mozilla.org/en-US/docs/Glossary/Primitive:
- string
- number
- boolean
- null
- 不明确的
- symbol
当您将这些类型中的任何一种分配给变量时,实际数据将存储在该变量中,并且如果您将一个变量设置为等于另一个变量,则会出现复制(不是链接)原语的创建并存储在新变量中:
var a = 10; // Store the actual number 10 in the a variable
var b = a; // Store a COPY of the actual number stored in a (10) in the b variable
a = 50; // Change the actual data stored in a to 50 (no change to b here)
console.log("a is: " + a); // 50
console.log("b is: " + b); // 10
当你与参考类型 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Objects,发生了一些不同的事情。将变量分配给引用类型意味着该变量仅保存对实际存储对象的内存位置的引用,而不是实际对象本身。所以,当你这样做时:
var a = {foo:"bar"};
a
实际上并不存储对象本身,它只存储可以找到对象的内存位置(即0x3C41A)。
但是,就设置另一个变量等于第一个变量而言,它仍然像处理基元一样工作 - - a copy第一个变量中的内容被生成并赋予第二个变量。
这是一个例子:
// An object is instantiated in memory and a is given the address of it (for example 0x3C41A)
var a = {};
// The contents of a (the memory location of an object) is COPIED into b.
// Now, both a and b hold the same memory location of the object (0x3C41A)
var b = a;
// Regardless of whether a or b is used, the same underlying object
// will be affected:
a.foo = "test";
console.log(b.foo); // "test"
// If one of the variables takes on a new value, it won't change
// what the other variable holds:
a = "something else";
console.log("a is: ", a); // The new string primitive stored in memory
console.log("b is: ", b); // The object stored in memory location (0x3C41A)
因此,在您的第一个测试中,您只有两种访问一个对象的方法,然后更改什么a
将(对象的内存位置)保存到另一个对象,因此现在您只剩下一种方法来访问原始对象,通过b
.
如果我们尝试“清除”a
通过设置a = {}
, 目的b
会保持
不变。我不明白为什么要以这种方式操纵一个对象
产生与第一个示例不同的结果。
因为现在我们知道a = {}
没有清除该对象。它只是指向a
在别的事情上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)