上一节讲到了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的地址。