将值赋值给变量和将值存储到变量之间有什么区别

时间:2016-01-27 13:04:43

标签: javascript oop

我正在读一本关于面向对象的javascript的书,我发现了这个:

  

引用类型不会将对象直接存储到为其分配的变量中,因此   此示例中的对象变量实际上不包含对象实例。相反,它持有   指向对象存在的内存中的位置的指针(或引用)。这是主要的   对象和原始值之间的差异,因为原语直接存储在变量中。

我的问题是 这是什么意思?

"引用类型不会将对象直接存储到分配给它的变量中,因此本示例中的对象变量实际上不包含对象实例。" ??

enter image description here

6 个答案:

答案 0 :(得分:2)

通过一个例子可以更清楚:

var obj1 = { name: "John" };
var obj2 = obj1;

obj1obj2指向内存中的相同位置。 可以通过更改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