前端--關(guān)于值類型和引用類型(放心舷胜,術(shù)語(yǔ)很少)

在幫同事解決問(wèn)題時(shí),經(jīng)常遇到諸如:

  • 我沒(méi)有改過(guò)這個(gè)數(shù)據(jù)啊,為什么會(huì)變了...
  • 為什么我在頁(yè)面A修改了數(shù)據(jù)烹骨,頁(yè)面B的也會(huì)變

原因通常都是引用類型翻伺,既然引用類型容易引起誤解,那為什么還要設(shè)計(jì)引用類型沮焕?

答案是性能吨岭。

做個(gè)小測(cè)試,循環(huán)一定次數(shù)峦树,給分別給值類型和引用類型賦值辣辫,觀察

  • 內(nèi)存占用
  • CPU占用
  • 耗時(shí)
const cpuStat = require('cpu-stat');

function sub(x1, x2) {
  let result = {};
  for (const key in x2) {
    result[key] = x2[key] - x1[key];
  }
  return result;
}

function loop(des, func, count) {
  return new Promise((resolve) => {
   // 強(qiáng)制GC,且在2秒后再運(yùn)行代碼
    global.gc();

    setTimeout(() => {
      cpuStat.usagePercent(function (err, percent, seconds) {
        if (err) {
          return console.log(err);
        }
        console.log(`${des}CPU: ${percent}`);
      });
      const startM = process.memoryUsage();
      const startTime = Date.now();
      for (let i = 0; i < count; i++) {
        func();
      }
      const endM = process.memoryUsage();
      const endTime = Date.now();
      console.log(`${des}Memory: ${JSON.stringify(sub(startM, endM), null, 2)}`);
      console.log(`${des}Time: ${endTime - startTime}`);

      setTimeout(() => {
        resolve();
      }, 3000)
    },2000)
  })
}

const count = 2000000000;

async function execute() {
  const strSource = '某柏慧燕都非要玩要一二三五點(diǎn)五十旱地';
  await loop('str', () => {
    let str = strSource;
  }, count);

  const objSource = { x: strSource };

  await loop('obj', () => {
    let obj = objSource;
  }, count);
}

execute();

運(yùn)行三次的結(jié)果魁巩,平均來(lái)看
引用類型的內(nèi)存占用有巨大的優(yōu)勢(shì)

內(nèi)存

值類型(string)占用內(nèi)存為:2330624字節(jié)
引用類型(object)占用內(nèi)存為:733184字節(jié)

約3倍

耗時(shí)

值類型為:1021毫秒
引用類型為:779毫秒

約1.3倍

CPU占用

值類型為:9.039%
引用類型為:7.960%
約1.13倍

由此可見急灭,引用類型在性能,特別是內(nèi)存占用上有巨大的優(yōu)勢(shì)谷遂。所以葬馋,為了性能,必須要把引用類型弄清楚肾扰。

我們知道畴嘶,計(jì)算機(jī)的臨時(shí)數(shù)據(jù)是存在內(nèi)存中,而每塊內(nèi)存又要有起始地址白对。
換一個(gè)形象的例子:有一排杯子,用來(lái)存東西换怖,每個(gè)杯子上綁了一些線甩恼。杯子表示內(nèi)存,線表示指向內(nèi)存的變量

  • 引用類型:每次賦值就是在杯子上綁一根線沉颂,定義1000個(gè)變量=這個(gè)杯子条摸,相當(dāng)于在杯子上綁了1000根線
  • 值類型:每次賦值就是加一個(gè)新杯子,并在杯子上綁一線

其中铸屉,杯子就是占用的內(nèi)存钉蒲,線就是定義的變量

image.png
image.png

顯示,對(duì)于

  • 引用類型彻坛,其中通過(guò)其中一根獲取到杯子顷啼,并往里面加了水。 對(duì)于綁在杯子上的其它線昌屉,水也增加了钙蒙。
  • 對(duì)于值類型,因?yàn)橐桓€只能對(duì)應(yīng)一個(gè)杯子间驮,所以通過(guò)某根線獲取到杯子躬厌,并里面加水,不會(huì)影響到其它線綁定的杯子竞帽。

當(dāng)然扛施,有些語(yǔ)言鸿捧,可以直接操作內(nèi)存,比如C++不僅有指針疙渣,還有指針的指針匙奴,這里就不考慮了。

                                  -------------附運(yùn)行結(jié)果圖------------
image.png
image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昌阿,一起剝皮案震驚了整個(gè)濱河市饥脑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌懦冰,老刑警劉巖灶轰,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刷钢,居然都是意外死亡笋颤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門内地,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伴澄,“玉大人,你說(shuō)我怎么就攤上這事阱缓》橇瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵荆针,是天一觀的道長(zhǎng)敞嗡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)航背,這世上最難降的妖魔是什么喉悴? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮玖媚,結(jié)果婚禮上箕肃,老公的妹妹穿的比我還像新娘。我一直安慰自己今魔,他們只是感情好勺像,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著错森,像睡著了一般咏删。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上问词,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天督函,我揣著相機(jī)與錄音,去河邊找鬼。 笑死辰狡,一個(gè)胖子當(dāng)著我的面吹牛锋叨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宛篇,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娃磺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叫倍?” 一聲冷哼從身側(cè)響起偷卧,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吆倦,沒(méi)想到半個(gè)月后听诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚕泽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年晌梨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须妻。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仔蝌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荒吏,到底是詐尸還是另有隱情敛惊,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布绰更,位于F島的核電站瞧挤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏动知。R本人自食惡果不足惜皿伺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一员辩、第九天 我趴在偏房一處隱蔽的房頂上張望盒粮。 院中可真熱鬧,春花似錦奠滑、人聲如沸丹皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摊崭。三九已至,卻和暖如春杰赛,著一層夾襖步出監(jiān)牢的瞬間呢簸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留根时,地道東北人瘦赫。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛤迎,于是被迫代替她去往敵國(guó)和親确虱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354