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?(这一点我能在一定程度上理解,但澄清上述两个将有助于更清楚地理解它) 请引导