JavaScript 中的兩種數(shù)據(jù)類型

我們知道辞槐,JavaScript 是一門弱類型的語言壶硅,它創(chuàng)建的變量保存的值是可以在腳本生命周期內(nèi)改變的腊凶,假如初始化定義的變量值為數(shù)字(var a = 1;)编矾,然后進行改變它的值的操作(a = a + '個';)狼渊,這個變量值就會轉(zhuǎn)換為字符串類型(alert(a); // "1個")箱熬。實際上类垦,JavaScript 的變量實際復(fù)雜程度還遠不止如此。

基本類型和引用類型

一個變量可以存放兩種類型的值城须,基本類型的值(primitive values)和引用類型的值(reference values)蚤认。基本類型值指的是簡單的數(shù)據(jù)段糕伐,而引用類型值指那些可能由多個值構(gòu)成的對象砰琢。

JavaScript 中共有 6 種基本數(shù)據(jù)類型:Undefined、Null良瞧、Boolean陪汽、Number、String褥蚯、Symbol (new in ES 6) 挚冤!

基本類型的幾個特點:
1.基本類型的值是不可變的;
2.基本類型的比較是值的比較赞庶;
3.基本類型的變量是存放在棧區(qū)的(棧區(qū)指內(nèi)存里的棧內(nèi)存)训挡。

除了上面的 6 種基本數(shù)據(jù)類型外,剩下的就是引用類型了歧强,統(tǒng)稱為 Object 類型澜薄。細分的話,有:Object 類型摊册、Array 類型肤京、Date 類型、RegExp 類型茅特、Function 類型 等蟆沫。

引用類型的幾個特點:
1.引用類型的值是可變的;
2.引用類型的值是同時保存在棧內(nèi)存和堆內(nèi)存中的對象温治;
3.引用類型的比較是引用的比較饭庞。

進一步了解基本類型和引用類型,參見文末的參考文章熬荆。

對引用類型不同的拷貝方式

基于以上對 JavaScript 的兩種不同數(shù)據(jù)類型的理解舟山,我們知道,對一個保存了基本類型值的變量和一個保存了引用類型值的變量卤恳,它們的賦值累盗、拷貝和類型檢測等操作是不一樣的,而導(dǎo)致這種差異的原因突琳,歸根結(jié)底若债,是因為它們在內(nèi)存中儲存的方式不一樣〔鹑冢基本類型的值是保存在內(nèi)存的棧區(qū)中蠢琳,引用類型的值是由內(nèi)存中的棧區(qū)和堆區(qū)共同完成保存啊终,棧區(qū)保存的是堆內(nèi)存的地址或者說指向堆內(nèi)存中的對象的指針,堆內(nèi)存中的對象才是引用類型的實際值傲须。

淺拷貝

實際上蓝牲,基本類型值的拷貝,并不涉及到淺拷貝與深拷貝泰讽,因為對它的拷貝是在內(nèi)存中新開辟一段棧內(nèi)存例衍,變量之間互不影響。引用類型值的拷貝則不一樣已卸,在棧內(nèi)存中佛玄,兩個變量都保存了同一個對象地址,則這兩個變量指向了同一個堆內(nèi)存中的對象累澡。因此翎嫡,改變其中任何一個變量,都會相互影響永乌。我們把這兩種類型的值的拷貝放在這里比較:
基本類型值的拷貝

var num1 = 5;
var num2 = num1;


引用類型值的拷貝

var obj1 = new Objuect();
var obj2 = obj1;
obj1.name = "Nicholas";
alert (obj2.name);  // "Nicholas"

深拷貝

拷貝一個引用類型的值惑申,除了單純地拷貝它的引用(棧內(nèi)存地址),有沒有辦法拷貝它真實的值(堆內(nèi)存中的對象)呢翅雏?其實辦法有很多種圈驼,并且針對不同的引用類型的值也有不同的深拷貝方法,以下是常用的深拷貝方法:

第一種:for循環(huán)實現(xiàn)對象的深拷貝

//如果包含屬性值是數(shù)組望几,無法深層拷貝數(shù)組里面的數(shù)據(jù)
var obj = {
  name: 'jingjing',
  sex: 'girl',
  old: '18'
}
var obj2 = copyObj(obj)
function copyObj(obj) {
  let res = {}
  for (var key in obj) {
    res[key] = obj[key]
  }
  return res
}

第二種:轉(zhuǎn)換成json再轉(zhuǎn)換成對象實現(xiàn)對象的深拷貝(對象里面不包含函數(shù)的情況下使用,注意這種直接粗暴的方法只能拷貝json格式數(shù)據(jù)對象绩脆,函數(shù)會丟失)

var obj = {
  name: jingjing',
  sex: 'girl',
  old: '18'
}
var obj2 = JSON.parse(JSON.stringify(obj))

第三種:擴展運算符實現(xiàn)對象的深拷貝(隨著es6的逐漸推廣,此招兒推薦使用)

//如果包含的屬性值是數(shù)組橄抹,無法深層拷貝數(shù)組里面的數(shù)據(jù)
var obj = {
  name: 'jingjing',
  sex: 'girl',
  old: '18'
}
var { ...obj2 } = obj
obj.old = '22'
console.log(obj)  //{name: "jingjing", sex: "girl", old: "22"}
console.log(obj2) //{name: "jingjing", sex: "girl", old: "18"}

總結(jié)

在 JavaScript 中靴迫,有兩種不同的類型的變量,分別是保存了基本類型的值的變量和保存了引用類型的值的變量楼誓,這兩種類型的值因為在內(nèi)存中的儲存方式的異同玉锌,所以相應(yīng)的操作也不同。在這篇文章中疟羹,我們具體分析了引用類型中對象的拷貝方法主守,實際應(yīng)用中用到深拷貝的地方也比較多。希望這篇文章對您有用榄融,文中如有不當之處参淫,敬請指出。
參考文章:
JavaScript 深入了解基本類型和引用類型的值

本文由博客群發(fā)一文多發(fā)等運營工具平臺 OpenWrite 發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愧杯,一起剝皮案震驚了整個濱河市涎才,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌力九,老刑警劉巖耍铜,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑闺,死亡現(xiàn)場離奇詭異,居然都是意外死亡业扒,警方通過查閱死者的電腦和手機检吆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門舒萎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來程储,“玉大人,你說我怎么就攤上這事臂寝≌吕穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵咆贬,是天一觀的道長败徊。 經(jīng)常有香客問我,道長掏缎,這世上最難降的妖魔是什么皱蹦? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮眷蜈,結(jié)果婚禮上沪哺,老公的妹妹穿的比我還像新娘。我一直安慰自己酌儒,他們只是感情好辜妓,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忌怎,像睡著了一般籍滴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榴啸,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天孽惰,我揣著相機與錄音,去河邊找鬼鸥印。 笑死灰瞻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辅甥。 我是一名探鬼主播酝润,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼璃弄!你這毒婦竟也來了要销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夏块,失蹤者是張志新(化名)和其女友劉穎疏咐,沒想到半個月后纤掸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡浑塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年借跪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酌壕。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掏愁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卵牍,到底是詐尸還是另有隱情果港,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布糊昙,位于F島的核電站辛掠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏释牺。R本人自食惡果不足惜萝衩,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望没咙。 院中可真熱鬧猩谊,春花似錦、人聲如沸镜撩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁梗。三九已至宜鸯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遮怜,已是汗流浹背淋袖。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锯梁,地道東北人即碗。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像陌凳,于是被迫代替她去往敵國和親剥懒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容