JS中的數(shù)據(jù)分為基本數(shù)據(jù)和引用類型數(shù)據(jù)兩大類,最大的區(qū)別在于:
- 基本數(shù)據(jù)類型的值不可變,引用類型可變
var name = "str1";
name = "str2";
console.log(name)//str2
這里改變的只是name的指針指向,str1和str2并沒(méi)有改變
- 基本數(shù)據(jù)類型不能添加方法和屬性,引用類型可以
- 基本類型賦值是簡(jiǎn)單賦值 創(chuàng)建新值 在棧中創(chuàng)建新的儲(chǔ)存位置
把a(bǔ)的值賦予b,此時(shí)內(nèi)存棧中有兩個(gè)值,一個(gè)是另一個(gè)的副本,互不影響
- 引用類型的賦值是對(duì)象引用
首先引用類型的值保存方式是指針保存在棧區(qū),引用類型的值保存在堆區(qū)
引用類型之間的賦值是指針間的賦值
引用類型之間的比較是指針間的比較
var obj1 = {}; var obj2= {}; console.log(obj1== obj2)//false
基本包裝類型是什么
為了便于操作基本類型值,ECMAScript提供了三個(gè)特殊的引用類型:Boolean、Number、String。每當(dāng)讀取一個(gè)基本類型值的時(shí)候,后臺(tái)會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型多的對(duì)象,從而可以調(diào)用一些方法來(lái)操作這些數(shù)據(jù)。調(diào)用過(guò)程如下:
var s1="some text";
var s2=s1.substring(1)
這段代碼經(jīng)歷了如下過(guò)程,都是在后臺(tái)進(jìn)行的:
1.創(chuàng)建一個(gè)String類型的一個(gè)實(shí)例;
2.在實(shí)例上調(diào)用指定方法;
3.銷毀這個(gè)實(shí)例
引用類型和基本包裝類型的主要區(qū)別在于對(duì)象的生存周期。自動(dòng)創(chuàng)建的基本包裝類型的值只存在于代碼執(zhí)行的一瞬間。所以我們不能在運(yùn)行期間給基本包裝類型值添加方法。
直接使用構(gòu)造函數(shù)和使用new 調(diào)用構(gòu)造函數(shù)創(chuàng)建的基本包裝類型的值 仍然有不同點(diǎn)
var s1="text";
s1.color="red";
console.log(s1.color);//undefined
var s_obj=String("text");
s_obj.color='red';
console.log(s_obj.color);//undefined
var s_obj_new=new String("text");
s_obj_new.color='red';
console.log(s_obj_new.color);//red