【前端思考】字符串类型的数据,应该存栈内存还是堆内存当中?(可能出乎你的意料)

按照大家的经验以及前端知识,字符串类型的数据,应该存栈内存还是堆内存当中?
随便在网上一搜,
在这里插入图片描述

在这里插入图片描述
我们知道,字符串属于基本类型,那按照上面的说法,字符串一定是存储在栈内存当中。但是,在V8引擎里不是这样的。

在v8引擎中,字符串是以对象的形式存储在堆中的。字符串对象包含了字符串的长度、字符编码等信息。当我们在JavaScript代码中创建一个字符串时,V8引擎会在堆中为该字符串分配内存空间,并将字符串的内容存储在这个空间中。虽然字符串本身存储在堆中,但是字符串对象的引用(指针)通常存储在栈中。当我们在JavaScript代码中使用字符串的时候,实际上是操作字符串对象的引用。

通过搜索一些资料,在V8引擎中,字符串是存储在一个叫string-table的对象中。string-table的本质是一个映射表,用于存储内部化的字符串。这个表的主要目的是实现字符串的内存共享,以减少内存使用和提高性能。

以下是它的源码,
在这里插入图片描述

当一个字符串被内部化的时候,它被添加到string-table中,然后,每当需要相同的字符串时,V8可以直接从string-table中获取,而不是创建一个新的字符串对象。这样可以减少内存使用,因为相同的字符串只需要存储一次。此外,从string-table中获取字符串比创建新的字符串对象更快,因此也可以提高性能。
此外,string-table还用于快速比较字符串。由于内部化的字符串是唯一的,因此比较两个内部化的字符串只需要比较它们的引用,而不需要逐个字符地比较。这可以大大提高字符串比较的性能。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值