我正在读一本关于面向对象的javascript的书,我发现了这个:
引用类型不会将对象直接存储到为其分配的变量中,因此 此示例中的对象变量实际上不包含对象实例。相反,它持有 指向对象存在的内存中的位置的指针(或引用)。这是主要的 对象和原始值之间的差异,因为原语直接存储在变量中。
我的问题是 这是什么意思?
"引用类型不会将对象直接存储到分配给它的变量中,因此本示例中的对象变量实际上不包含对象实例。" ??
答案 0 :(得分:2)
通过一个例子可以更清楚:
var obj1 = { name: "John" };
var obj2 = obj1;
obj1
和obj2
指向内存中的相同位置。
可以通过更改name
属性:
obj2.name = "Bob";
console.log(obj1.name); // "Bob"
基元的另一种行为:
var string1 = 'string';
var string2 = string1;
string1和string2指向内存中的不同位置。因此,更改string2
不会影响string1
string2 = 'new string';
console.log(string1); // 'string'
答案 1 :(得分:2)
在您提供的图片中,您可以看到
var object1 = new Object();
var object2 = object1;
在这种情况下,您有两个变量,它们都将引用(想想指针)存储到内存中的另一个位置。在这个地方存储对象。如果您通过其中一个引用更改了对象,并通过另一个引用访问它,您将看到它已更改。
object1.someVariable = 'asdf';
object2.someVariable = 'newValue';
console.log(object1.someVariable); // will give 'newValue'
console.log(object2.someVariable); // will also give 'newValue'
如果您有标量值,它们将不存储引用,它们将存储值本身。
想想另一个例子:
var primitiveString = 'asdf';
var anotherPrimitiveString = primitiveString;
由于两者都存储了自己的值,因此您可以更改两个字符串中的一个,但另一个字符串仍将包含asdf
,因为它们不会引用某些字符串。
anotherPrimitiveString = 'newValue';
console.log(primitiveString); // will give 'asdf'
console.log(anotherPrimitiveString); // will give 'newValue'
这里有一个jsfiddle的解释示例。
答案 2 :(得分:1)
你有一所房子。你=变量。房子=价值。现在,你必须证明你拥有那所房子。你得到一份文件,说明你是所有者。
当你四处走动时,你不必搬家。你可以向人们展示纸张。
房子=沉重,难以移动。 纸=小,轻,易移动。
那篇论文做了存储引用的内容。它实际上并不包含真实对象,但它告诉系统的其余部分。
答案 3 :(得分:1)
在计算机科学中,通常有两种类型的变量类型,指针和值。 指针除了地址之外不包含任何内容,因此计算机可以找到存储实际值的位置,而值存储实际数据。 指针的强大之处在于您可以定义一个值并使多个指针使用相同的值。这是一段代码和另一段代码的内存管理和双向通信的巨大收获。 这是javascript中指针的一个示例。
var foo = { value : 1};
var goo = foo;
goo.value = 4;
//now both goo.value and foo.value are both 4.
值就是这样。
var foo = 2;
var goo = foo;
goo = 4;
//now foo is 2 and goo is 4.
答案 4 :(得分:1)
Object1指的是某些内存位置(例如2002)。 Object2也指向相同的内存位置,但是引用了Object1。
答案 5 :(得分:1)
在js中,最好认为变量是指向对象的指针。当直接分配给变量时,您没有修改任何对象,而是将变量指向对象。
让我们举个例子
var a= b ={}
所以这里a
& b
是指向同一对象的指针。
现在设置a.someProp = 'value'
它设置了b.someProp
以及a
& b
指向同一个对象
在变量中存储值称为variable initialization