js中的數據類型有以下幾種:
Number Boolean undefined Object Function String Null
基本類型:Number Boolean String undefined null
引用類型:Object Function
基本類型的數據是存放在棧內存中的,而引用類型的數據是存放在堆內存中的
復制變量值
基本類型:
var p = 1; var p1 = p;
執行結果:
也就是說,基本類型的復制就是在棧內存中開辟出了一個新的存儲區域用來存儲新的變量,這個變量有它自己的值,只不過和前面的值一樣,所以如果其中一個的值改變,則不會影響到另一個。
引用類型:
var object1 = new Object(); var object2 = object1;
object2復制了object1的值,但是結果卻不是像基本類型復制一樣的
執行結果:
定義了一個對象其實是在棧內存中存儲了一個指針,這個指針指向堆內存中該對象的存儲地址。復制給另一個對象的過程其實是把該對象的地址復制給了另一個對象變量,兩個指針都指向同一個對象,所以若其中一個修改了,則另一個也會改變。
object.name = 'jhon'; alert(object.name); //jhon
基本類型的數據是沒有屬性和方法的,引用類型才會有,但是為什么String類型卻又那么多方法呢?
var string = "aaa"; var string2 = string.substring(0)); //aaa
基本類型的確沒有方法和屬性,因為一旦創建了屬性或者方法就會被立刻銷毀,但是為了方便程序員對這類的基本類型數據比較方便的操作,在底層做了一些工作,其實這段代碼相當於:
var string = new String("aaa"); var string2 = string.substring(0); string = null;
(1)創建一個String類型的實例(使用 new 操作符創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型的對象,則只存在於一
行代碼的執行瞬間,然后立即被銷毀 )
(2)在實例上調用指定方法
(3)銷毀該實例
經過這三步,字符串值就變得和對象一樣了,在Boolean Number中也是這樣
String Boolean Number 這三種類型也叫做 基本包裝類型