当前位置: 首页 > 面试题库 >

js的数组/对象在内存中分别是如何存储的?

王凌
2023-03-14
本文向大家介绍js的数组/对象在内存中分别是如何存储的?相关面试题,主要包含被问及js的数组/对象在内存中分别是如何存储的?时的应答技巧和注意事项,需要的朋友参考一下

JavaScript的对象是以一个描述ID、一个内容指针、以及跟随该对象的属性进行储存的。

当对象构造简单时,内容指针并不起作用,而所有属性直接跟在对象的内存地址之后。

比如对象{a: 1, b: 2},若其内存地址为0x1000,则该对象在内存中为

0x1000 0x1008 0x1010 0x1018
描述ID 指针(空) a b

不同于大多数语言,该指针指向的地址是同时向左右两个方向进行储存该对象的属性。由于这种对称的特性,很多人将JavaScript的内容指针称之为蝴蝶(Butterfly)。

当对象类型复杂时,比如对象包含7个以上的属性,那么butterfly就会起到作用
比如对象{a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7},若其内存地址为0x1000,则该对象在内存中为

0x1000 0x1008
描述ID butterfly

若该butterfly指向0x8000,则该地址内存构造大致为:

0x7ff0 0x7ff8 0x8000(butterfly) 0x8008 0x8010 0x8018 0x8020 0x8028
- g a b c d e f

而当一个对象为数组时,该数组的butterfly一般为:

0x7ff0 0x7ff8 0x8000(butterfly) 0x8008 0x8010 0x8018
- length 元素1 元素2 元素3 元素4

如果你给这个数组加一些其他的属性,比如arr.a = 1; arr.b = 2,那么该对象的butterfly就会变成

0x7fe0 0x7fe8 0x7ff0 0x7ff8 0x8000(butterfly) 0x8008 0x8010 0x8018
- b a length 元素1 元素2 元素3 元素4
 类似资料:
  • 问题内容: 我有一个要存储在Redis中的对象数组。我可以分解数组部分,并将它们存储为对象,但是我不知道如何获得类似 然后根据名称搜索数据库,并获取返回的密钥。我需要这样的东西。但几乎无法做到正确。 首先是使这一部分正确。 其次是以某种方式从值中获取密钥,即 我觉得很难。或者,我可以将其直接存储为对象数组并使用简单的for循环。 请建议哪种路线最适合某些实现? 问题答案: 我发现工作是将密钥存储为

  • 本文向大家介绍JS localStorage存储对象,sessionStorage存储数组对象操作示例,包括了JS localStorage存储对象,sessionStorage存储数组对象操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS localStorage存储对象,sessionStorage存储数组对象操作。分享给大家供大家参考,具体如下: 一、前言 最近在用angu

  • 如何在一个对象中存储对象和数组?更新一个对象内的对象和数组 const obj={key1:1,key2:2,key3:3,keys:['key1','key2','key3']};我在一次采访中得到了这个问题。现在我想在对象中添加一些新数据。2无论何时添加到对象中,都应在该主对象内的数组中更新“key_”(添加了key number)。 输出应该是这样的(你可以使用任何方法/函数/循环来更新它.

  • 在我的计算机科学课程中,我们被教导说,当你创建一个数组时,JVM会根据数组的大小自动分配内存。例如,如果您创建一个大小为10的整数数组,JVM会为该数组分配10*32位数据。 我的问题是,当您创建大小不同的对象数组时,这个过程到底是如何工作的?例如一个字符串对象。当您创建一个由10个字符串组成的数组时,系统上是否实际为这些字符串保留了任何内存,或者因为它们只是指针,所以不需要分配内存?

  • 我想在我的应用程序中缓存一个歌单,歌单结构如下: 操作sqlite3的库android.arch.persistence.room,但它不允许表中的对象引用。有没有办法通过使用Android的房间缓存歌曲列表?

  • 大家好,我有一个关于Java继承的具体问题。以下是我的代码 现在我的问题是,运行这个程序时,幕后到底发生了什么。 什么会遗传? 内存位置在哪里? 为什么第一个syso给4,第二个给5?(这一点我能在一定程度上理解,但澄清上述两个将有助于更清楚地理解它) 请引导