原始值与参考值

时间:2012-11-07 09:20:42

标签: javascript

我读了一本名为“面向Web开发人员的专业Javascript”的书,它说:“变量由参考值或原始值指定。参考值是存储在内存中的对象”。然后它没有说明如何存储原始值。所以我猜它没有存储在内存中。基于此,当我有这样的脚本时:

var foo = 123;

Javascript如何记住foo变量供以后使用?

6 个答案:

答案 0 :(得分:58)

variable可以包含以下两种值类型之一:primitive valuesreference values

  • Primitive values是存储在堆栈上的数据。
  • Primitive value直接存储在变量访问的位置。
  • Reference values对象,存储在中。
  • 存储在变量位置的
  • Reference value是指向存储对象的内存中的位置的指针。
  • 原始类型包括UndefinedNullBooleanNumberString

基础:

对象是属性的聚合。酒店可以引用objectprimitivePrimitives are values,他们没有属性。

<强> 更新

JavaScript有6种原始数据类型:字符串数字布尔未定义符号(ES6中的新功能)。除了null和undefined之外,所有基元值都具有包围原始值的对象等价物,例如, String 对象包装字符串基元。所有原语都是不可变的。

答案 1 :(得分:4)

在javascript中,Primitive values数据,存储在stack上。

Primitive value直接存储在变量访问的位置。

存储在Reference values中的heap 对象

存储在变量位置的参考值是指向存储对象的存储器中的位置的指针。

JavaScript支持五种原始数据类型:number, string, Boolean, undefined, and null

这些类型称为基本类型,因为它们是可以构建更复杂类型的基本构建块。

在五个中,只有number, string, and Boolean是实际存储数据意义上的真实数据类型。

Undefined and null是在特殊情况下出现的类型。 primitive type在内存中具有固定大小。 例如,一个数字占用8个字节的内存,而布尔值只能用一个位表示。

参考类型可以是任意长度 - 它们没有固定的大小。

答案 2 :(得分:1)

基本类型在内存中具有固定大小。例如,一个数字占用8个字节的内存,而布尔值只能用一个比特表示。数字类型是原始类型中最大的。如果每个JavaScript变量保留8个字节的内存,则该变量可以直接保存任何原始值。

这是一个过于简单化的内容,并不是对实际JavaScript实现的描述。

参考类型是另一回事。例如,对象可以是任何长度 - 它们没有固定的大小。数组也是如此:数组可以包含任意数量的元素。同样,函数可以包含任意数量的JavaScript代码。由于这些类型没有固定大小,因此它们的值不能直接存储在与每个变量关联的8个字节的内存中。相反,变量存储对值的引用。通常,此引用是某种形式的指针或内存地址。它不是数据值本身,而是告诉变量在哪里查找值。

原始类型和引用类型之间的区别是重要的,因为它们的行为不同。请考虑以下使用数字的代码(基本类型):

var a = 3.14;  // Declare and initialize a variable
var b = a;     // Copy the variable's value to a new variable
a = 4;         // Modify the value of the original variable
alert(b)       // Displays 3.14; the copy has not changed

这段代码并不令人惊讶。现在考虑如果我们稍微更改代码以便它使用数组(引用类型)而不是数字会发生什么:

var a = [1,2,3];  // Initialize a variable to refer to an array
var b = a;        // Copy that reference into a new variable
a[0] = 99;        // Modify the array using the original reference
alert(b);         // Display the changed array [99,2,3] using the new reference

如果这个结果对您来说并不令人惊讶,那么您已经熟悉原始类型和引用类型之间的区别。如果看起来确实令人惊讶,请仔细看看第二行。请注意,它是对此语句中分配的数组值的引用,而不是对数组本身的引用。在第二行代码之后,我们仍然只有一个数组对象;我们碰巧有两个引用它。

答案 3 :(得分:0)

原始值是在语言实现的最低级别表示的数据,在JavaScript中是以下类型之一:number,string,Boolean,undefined和null。

答案 4 :(得分:0)

原始与参考:

变量是javascript引擎保留以保留数据的内存段(RAM)。在这些变量中可以存储2种值:

  • 实际数据:例如字符串或数字。这意味着实际的内存(即内存中的字节)将保存数据本身。
  • 对对象的引用:例如数组对象或函数对象。这意味着该变量仅保留对该对象所在的内存中另一个位置的引用

原始值与参考值之间的差异:

当将原始值分配给变量时,刚刚复制的数据(位的值)。例如:

原始值:

let num1 = 10;

// What happens here is that the bits which are stored in the memory container 
// (i.e. variable num1) are literally copied into memory container num2
let num2 = num1;

参考值:

let objRef1 = {prop1: 1}

// we are storing the reference of the object which is stored in objRef1
// into objRef2. Now they are pointing to the same object
let objRef2 = objRef1;

// We are manipulating the object prop1 property via the refernce which
// is stored in the variable objRef2
objRef2.prop1 = 2;

// The object which objRef1 was pointing to was mutated in the previous action
console.log(objRef1);

答案 5 :(得分:0)

正如已接受的答案和最高投票的答案中已经提到的那样,原始值是存储在堆栈中的数据,参考值是存储在堆中的对象。

但这实际上是什么意思?它们在您的代码中的表现如何不同?

按值访问原始值。因此,当您将具有原始值的变量(var a)分配给另一个变量(var b)时,变量(a)的值将被复制到新变量(b)中。并且当您更改新变量(b)的值时,原始变量的值保持不变。

当您将具有参考值的变量(var x)分配给另一个变量(var y)时,存储在变量(x)中的值也将复制到新变量(y)中。区别在于,两个变量中存储的值现在是堆中存储的实际对象的引用。这意味着x和y都指向同一对象。因此,当您更改新变量(y)的值时,原始值(x)的值也会更改(因为堆中的实际对象已更改)。