上一节讲到了JavaScript的基本类型与引用类型,这一节具体讲他们的各自的特性和区别:
1.基本类型没有属性和方法
var name = ”Leo“;
name.age = 25;
alert(name.age); //undefined
alert(name.charAt(0));//L
说明基本类型可以调用对应基本包装类型的方法,但是不能像对象一样拥有属性和方法。这是什么原因呢?
这是因为当执行类似name.age = 25;name.charAt(0);这样的操作时,后台实际上自动完成了一系列的处理:
(1)创建String类型的一个实例;
(2)在实例上调用指定的方法;
(3)销毁这个实例。
可以将以上三个步骤想象成执行了下列代码:
var s1 = new String("Leo");
s1.age = 25;
s1 = null;//对应name.age = 25;
var s2 = new String("Leo");
alert(s2.age);
s2 = null;//对应alert(name.age);
var s3 = new String("Leo");
alert(s3.charAt(0));
s3 = null;//对应alert(name.charAt(0));
即基本类型每次调用属性或方法都会创建新的对象,随后便销毁。
2.基本类型与引用类型的存储与赋值
var a = 0;
var b = a;
b = 1;
alert(a);//0
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "Leo";
alert(obj1 .name);//Leo
obj2 = new String("abc");
alert(obj1 instanceof String);//false
基本类型的值直接保存在栈内存中,赋值时会在栈中创建一个新值,然后把值赋给变量,因此两个变量并无关联。
引用类型的值保存在堆内存中,栈内存中保存其值在堆内存中保存的地址,引用类型的变量名实际为指针。再进行赋值操作var obj2 = obj1时,实际是把obj1的值的地址赋给了obj2,因此obj1、obj2实际指向同一个对象。obj2 = new String("abc")操作,令obj2指向另一个字符串对象,但这对obj1没有任何影响。
3.函数传参
function setName( obj ) {
obj.name = "Leo";
obj = new Object();
obj.name = "hou";
}
var person = new Object();
setName(person);
alert(person.name); //Leo
一句话:JavaScript函数传递参数是按值传递。因此setName(person)实际传得是person的地址。