成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

「字符串」存在「棧內存」?那我可要杠你了哦!

開發 前端
當我們新建一個字符串時,V8會從內存中查找一下是否已經有存在的一樣的字符串,找到的話直接復用。如果找不到的話,則開辟一塊新的內存空間來存這個字符串,并把地址賦給變量。

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。

在我們的認知里:基礎類型存棧內存,引用數據類型存堆內存。

const a = '林三心'
const b = {
    age: 18,
    height: 180
}

圖片圖片

超長字符串

大家都知道,字符串屬于基礎類型,所以大家會覺得字符串是存在棧內存中的,但是大家要知道,V8默認棧內存是984Kib,那如果一個超長字符串 > 984Kib能裝的進棧內存嗎?這也就是一個比較經典的問題——大象裝箱問題,試問:一頭大象能裝進一個小箱子里嗎?

圖片圖片

一探究竟

堆快照

先來看一段代碼

const func = function() {
  this.str1 = '林三心'
  this.str2 = 'Sunshine_Lin'
}

const a = new func()
const b = new func()

然后咱們來看看堆快照的詳情

圖片圖片

上面的結果可以看出:

  • a 和 b的str1都指向同一個地址
  • a 和 b的str2都指向同一個地址

那我們可不可以猜測出一個結論:字符串的內容存于堆內存中,指針存于棧內存中,且相同的字符串指向同一個堆內存地址

修改和新增字符串

我們稍微修改下代碼

const func = function() {
  this.str1 = '林三心'
  this.str2 = 'Sunshine_Lin'
}

const a = new func()
const b = new func()

// 修改str1
a.str1 = '哈哈哈哈哈哈哈哈哈哈'
// 新增str3,跟str2一樣
a.str3 = 'Sunshine_Lin'

再來看看現階段的堆快照的詳情

圖片圖片

上面的結果可以看出:

  • str1修改成一個新的字符串后,重新開辟了一個內存空間(新地址)
  • str3新增之后,指針指向已有的Sunshine_Lin的內存空間

那我們可不可以猜測出一個結論:新增或者修改字符串后,如果是一個之前不存在的字符串,則新開辟內存空間,如果是已有的,則直接使用已有的內存空間

源碼分析

當我們聲明一個字符串時:

  • 1、v8內部有一個名為stringTable的hashmap緩存了所有字符串,在V8閱讀我們的代碼,轉換抽象語法樹時,每遇到一個字符串,會根據其特征換算為一個hash值,插入到hashmap中。在之后如果遇到了hash值一致的字符串,會優先從里面取出來進行比對,一致的話就不會生成新字符串類。
  • 2、緩存字符串時,根據字符串不同采取不同hash方式。

圖片圖片

源碼

圖片圖片

圖片圖片

通俗易懂總結

字符串的數據存于 堆內存 中,棧內存 中只是存其 地址指針

當我們新建一個字符串時,V8會從內存中查找一下是否已經有存在的一樣的字符串,找到的話直接復用。如果找不到的話,則開辟一塊新的內存空間來存這個字符串,并把地址賦給變量。

大家有沒有想過,為什么字符串不能通過下標索引來進行修改呢?因為字符串的修改本質上只能是通過整個的修改,而不能局部修改。

責任編輯:武曉燕 來源: 前端之神
相關推薦

2018-02-05 10:18:42

技術管理注意

2024-04-01 08:41:39

字符串.NET

2021-09-07 09:23:07

C++字符串算法

2021-09-10 08:18:31

Go語言字符串

2021-12-10 08:17:48

字符串拼接場景

2021-09-07 06:40:25

貪心平衡字符串

2024-06-12 13:54:37

編程語言字符串代碼

2011-04-12 09:40:01

JDK內存

2019-08-06 15:06:35

2022-07-11 22:53:59

JavaScrip編譯信小程序

2009-06-23 14:13:00

Java字符串

2021-03-08 08:23:24

Java字符串截取

2010-11-26 09:51:54

MySQL字符串

2022-12-09 15:06:26

字符串Intl字符串分割

2022-12-21 08:05:04

字符串分割技巧

2014-01-02 16:14:10

PostgreSQL字符串

2009-07-16 17:01:09

Swing字符串

2023-01-11 16:49:13

MySQL數據庫

2011-08-10 18:47:18

Cocoa字符串

2010-09-09 11:48:00

SQL函數字符串
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区在线看 | 超碰在线97国产 | 一区二区成人 | 国产成人精品网站 | 欧美群妇大交群中文字幕 | 亚洲免费在线 | 午夜男人免费视频 | 欧美日韩一区二区三区四区五区 | 国产成人精品免费视频大全最热 | 久久久91精品国产一区二区精品 | 精品一区二区三区四区在线 | 91免费观看 | 99re在线视频 | 欧美精品在欧美一区二区 | 成人精品一区二区三区 | 国产成年人小视频 | 天堂资源 | 狠狠操电影 | 亚洲 中文 欧美 日韩 在线观看 | 色综合色综合 | 日韩有码在线播放 | 欧美一区二区在线观看 | 噜噜噜噜狠狠狠7777视频 | 黄色一级大片在线免费看产 | 一区二区三区四区av | 亚洲精品日韩欧美 | 天天拍天天操 | 日韩欧美三级电影在线观看 | 久久精品99国产精品 | www.国产视频| 91久久国产综合久久91精品网站 | 国产精品久久久久无码av | 国产精品久久久久久一区二区三区 | 九色视频网站 | 在线一区二区三区 | 久久久精品一区 | 狠狠的干狠狠的操 | 97精品超碰一区二区三区 | 一区二区三区精品视频 | 国产精品日韩一区二区 | 亚洲免费人成在线视频观看 |