JS 之基本类型值和引用类型值

431 阅读2分钟

1、基本类型值

基本类型值是指简单的数据段,如 Undefined、Null、 Boolean、 Number 和 String. 这 5 种基本数据类型是按值访问的。

    1. 基本类型的值不能添加属性: 我们不能给基本类型的值添加属性,虽然这样不会导致任何错误。以下例子说明这说明只能给引用类型值动态地添加属性,以便将来使用。
var name = 'xxl';
name.age = '19';
console.log(name.age); // undefined
    1. 基本类型值复制变量值:
var num1 = 5; 
var num2 = num1; 

在此,num1 中保存的值是 5。当使用 num1 的值来初始化 num2 时,num2 中也保存了值 5。但 num2中的 5 与num1 中的 5 是完全独立的,该值只是 num1 中 5 的一个副本。此后,这两个变量可以参与任何操作而不会相互影响。图 4-1 形象地展示了复制基本类型值的过程。

image.png

2、引用类型值

引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

    1. 引用类型值复制变量值:当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量,如下面的例子所示
var obj1 = new Object(); 
var obj2 = obj1; 
obj1.name = "Nicholas"; 
alert(obj2.name); //"Nicholas" 

首先,变量 obj1 保存了一个对象的新实例。然后,这个值被复制到了 obj2 中;换句话说,obj1 和 obj2 都指向同一个对象。这样,当为 obj1 添加 name 属性后,可以通过 obj2 来访问这个属性, 因为这两个变量引用的都是同一个对象。图 4-2 展示了保存在变量对象中的变量和保存在堆中的对象之 间的这种关系。

image.png