原始类型与对象类型的区别

动态的属性

定义原始类型的值和对象类型的值的方式是类似的:创建一个变量并为该变量赋值。
但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则相差很远。对于对象类型的值,可以为其添加属性和方法,也可以改变和删除其属性和方法,例如:

var person = new Object();
person.name = 'Nicholas';
alert(person.name);  //"Nicholas"

以上代码创建了一个对象并将其保存在变量 person 中。然后,为该变量添加一个名为name的属性,并将字符串值 "Nicholas"赋值给了这个属性。紧接着,又通过alert()函数访问了这个新属性。如果这个对象不被销毁或删除,则这个属性将一直存在。
但是,我们不能给原始类型的值添加属性,尽管这样做不会导致任何错误。比如:

var name = "Nicholas";
name.age = 27;
alert(name.age); // undefined

在这个例子中,我们为字符串 name 定义了一个名为age 的属性,并为该属性赋值27。但在下一行访问这个属性时,发现该属性不见了。这说明只能给对象类型动态地添加属性,以便将来使用。


复制变量值

除了保存的方式不同之外,在从一个变量向另一个变量复制原始类型和对象类型值时,也存在不同。

原始类型

var num1 = 5;
var num2 = num1;

在此,num1 中保存的值是5。当使用 num1 的值来初始化 num2时,num2中也保存了5这个值。但 num1中的5与num2中的5是完全独立的,num2中存放的值只是num1中5的一个副本。此后,这两个变量可以参与任何操作而不会相互影响。

对象类型
当从一个变量向另一个变量复制对象类型的值时,同样也会将存储在变量中的值复制一份放到另一个变量中。不同的是,这个值实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量,如下:

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); // "Nicholas"

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


猜你喜欢

转载自blog.csdn.net/xiebinyin/article/details/92199758
今日推荐