日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

js基础之引用数据类型

發(fā)布時(shí)間:2024/8/26 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 js基础之引用数据类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引用類(lèi)型數(shù)據(jù):

  也就是對(duì)象類(lèi)型Object type,比如:Object 、Array 、Function 、Data等。

  javascript的引用數(shù)據(jù)類(lèi)型是保存在堆內(nèi)存中的對(duì)象。

  與其他語(yǔ)言的不同是,你不可以直接訪問(wèn)堆內(nèi)存空間中的位置和操作堆內(nèi)存空間。只能操作對(duì)象在棧內(nèi)存中的引用地址。

  所以,引用類(lèi)型數(shù)據(jù)在棧內(nèi)存中保存的實(shí)際上是對(duì)象在堆內(nèi)存中的引用地址。通過(guò)這個(gè)引用地址可以快速查找到保存中堆內(nèi)存中的對(duì)象。

  var obj1 = new Object();

  var obj2 = obj1;

  obj2.name = "我有名字了";

  console.log(obj1.name); // 我有名字了

  說(shuō)明這兩個(gè)引用數(shù)據(jù)類(lèi)型指向了同一個(gè)堆內(nèi)存對(duì)象。obj1賦值給onj2,實(shí)際上這個(gè)堆內(nèi)存對(duì)象在棧內(nèi)存的引用地址復(fù)制了一份給了obj2,

  但是實(shí)際上他們共同指向了同一個(gè)堆內(nèi)存對(duì)象。實(shí)際上改變的是堆內(nèi)存對(duì)象。

  下面我們來(lái)演示這個(gè)引用數(shù)據(jù)類(lèi)型賦值過(guò)程:

與上一章的基本數(shù)據(jù)類(lèi)型的區(qū)別

  a 聲明變量時(shí)不同的內(nèi)存分配: 

  1)原始值:存儲(chǔ)在棧(stack)中的簡(jiǎn)單數(shù)據(jù)段,也就是說(shuō),它們的值直接存儲(chǔ)在變量訪問(wèn)的位置。

    這是因?yàn)檫@些原始類(lèi)型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域 – 棧中。這樣存儲(chǔ)便于迅速查尋變量的值。

  2)引用值:存儲(chǔ)在堆(heap)中的對(duì)象,也就是說(shuō),存儲(chǔ)在變量處的值是一個(gè)指針(point),指向存儲(chǔ)對(duì)象的內(nèi)存地址。

    這是因?yàn)椋阂弥档拇笮?huì)改變,所以不能把它放在棧中,否則會(huì)降低變量查尋的速度。相反,放在變量的棧空間中的值是該對(duì)象存儲(chǔ)在堆中的地址。

    地址的大小是固定的,所以把它存儲(chǔ)在棧中對(duì)變量性能無(wú)任何負(fù)面影響。

  b不同的內(nèi)存分配機(jī)制也帶來(lái)了不同的訪問(wèn)機(jī)制

   
  1)在javascript中是不允許直接訪問(wèn)保存在堆內(nèi)存中的對(duì)象的,所以在訪問(wèn)一個(gè)對(duì)象時(shí),
    首先得到的是這個(gè)對(duì)象在堆內(nèi)存中的地址,然后再按照這個(gè)地址去獲得這個(gè)對(duì)象中的值,這就是傳說(shuō)中的按引用訪問(wèn)
  2)而原始類(lèi)型的值則是可以直接訪問(wèn)到的。
  
  c 復(fù)制變量時(shí)的不同
  
  1)原始值:在將一個(gè)保存著原始值的變量復(fù)制給另一個(gè)變量時(shí),會(huì)將原始值的副本賦值給新變量,此后這兩個(gè)變量是完全獨(dú)立的,他們只是擁有相同的value而已。

  2)引用值:在將一個(gè)保存著對(duì)象內(nèi)存地址的變量復(fù)制給另一個(gè)變量時(shí),會(huì)把這個(gè)內(nèi)存地址賦值給新變量,
    也就是說(shuō)這兩個(gè)變量都指向了堆內(nèi)存中的同一個(gè)對(duì)象,他們中任何一個(gè)作出的改變都會(huì)反映在另一個(gè)身上。
    (這里要理解的一點(diǎn)就是,復(fù)制對(duì)象時(shí)并不會(huì)在堆內(nèi)存中新生成一個(gè)一模一樣的對(duì)象,只是多了一個(gè)保存指向這個(gè)對(duì)象指針的變量罷了)。多了一個(gè)指針
 
  d參數(shù)傳遞的不同(把實(shí)參復(fù)制給形參的過(guò)程
  
  首先我們應(yīng)該明確一點(diǎn):ECMAScript中所有函數(shù)的參數(shù)都是按值來(lái)傳遞的。
  但是為什么涉及到原始類(lèi)型與引用類(lèi)型的值時(shí)仍然有區(qū)別呢?還不就是因?yàn)閮?nèi)存分配時(shí)的差別。  
  1)原始值:只是把變量里的值傳遞給參數(shù),之后參數(shù)和這個(gè)變量互不影響。
  2)引用值:對(duì)象變量它里面的值是這個(gè)對(duì)象在堆內(nèi)存中的內(nèi)存地址,這一點(diǎn)你要時(shí)刻銘記在心!
    因此它傳遞的值也就是這個(gè)內(nèi)存地址,這也就是為什么函數(shù)內(nèi)部對(duì)這個(gè)參數(shù)的修改會(huì)體現(xiàn)在外部的原因了,因?yàn)樗鼈兌贾赶蛲粋€(gè)對(duì)象。

總結(jié)

以上是生活随笔為你收集整理的js基础之引用数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。