黑铁时代
Programing is not only one kind of technology, but also one kind of art.

JS的类型可以分为两大类:基本数据类型引用数据类型

 

一 基本数据类型

  包括:Number,string,Boolean,Undefined和Null。由于这5中基本类型占有固定的内存空间,所以通常都是保存在中,即直接将它们的值保存在内存中。我们每次从栈内存中可以直接取出其值。

 

二 引用数据类型

  通常指的就是对象,由于对象是可变的,占有的内存空间大小不规定,所以JS将对象保存在中,而访问对象的地址保存在栈中,那么我们在访问一个对象时,我们是先到栈中取出对象的地址,然后通过地址的值,在堆中找到真正的对象。

 

三 关于变量的复制

  对于基本类型,将a变量赋值给b变量,b变量是保存了一个a变量的副本,他们之间相互对立,因为他们都在栈中有自己的内存空间。而如果变 量指向的是一个对象,那么情况有复杂一点。如果var b = new Object(),那么b保存的是一个指向对象的地址值,这个地址值存在于栈空间中,当将其赋值给a变量的时候,实际上是将这个地址值赋值给a变量,然后a和b都具有相同的地址值,这个值就只想同一个对象,而这个对象存在于堆中。如果改变a或b中的一个,那么另一个变量就会发生相同的改变。

    栈内存

  a  12

  b  12 (b= a,将a的值拷贝一份给b)

    栈变量          堆变量

  a  object的地址      object (a和b的地址都指向这个object)

  b  object的地址

 

四 关于函数的参数传递

  很多语言中都有值传递和引用传递的概念,而JS中只有值传递。JS的函数中的参数相当于函数中的局部变量,当函数在执行时传入了参数,这个时候是将外部的值传递给了函数的局部变量。如果传入的参数是基本数据类型,那么就是将其值拷贝一个副本传递给了函数。如果传入的是一个对象,其实也是拷贝的一个地址值传递给函数,所以如果在函数中改变这个对象的同样也会影响外部对象,这种情况就有点像是引用传递,事实上JS中没有引用这个概念,栈中即使有两个变量a和b拥有相同的地址值,他们指向同一个对象c,更确切的说,应该是两个变量共享这个对象,你可以随时将其中一个变量a赋值成其他类型如123,并不会影响对象c。如果你也将变量b赋值成其他类型,那么对象c就没有任何变量引用它了,那么当引用计数器发现这个对象c已经不存在任何引用的时候,垃圾回收器就会释放这个对象。

  

  

 

posted on 2012-06-17 23:01  黑铁时代  阅读(179)  评论(0)    收藏  举报