JavaScript 引用

WingDust
  • 103

image.png
这个代码中 {视:[视频]} 数组保存的是对 视频 字符串的引用吗?

如果是引用的话

那是不是可以说下面的代码 kk1 内存占用的小
image.png
由于上面是基本数据类型,所以是值复制

更新:

那引用数据类型呢
image.png

回复
阅读 405
2 个回答
✓ 已被采纳

原则

JS 基本类型内存直接开辟在Stack
JS 引用类型内存开辟在Heap中,然后Stack存储对Heap的引用
array 和 object 都是引用类型

首先对题主第一个问题:

JS基本类型(undefined,null,number,boolean,string)是直接分配Stack内存的,不存在引用。
比如

var a = 'a'
var b = [a]
// 等同于下面操作,内存的分配没什么区别:
var a = 'a'
var b = ['a']

对题主第二个问题

js的array很特殊,和其他大部分语言不太语言。JSArray 是继承自 JSObject,你可以把看做是下标是 \(0,1,2,3,...\) 的 object
var 视频 = ['视频']
var k = {视: 视频, a: 视频}
var k1 = {a: '视频', b: '视频'}

这段代码

  1. var 视频 = ['视频'] 这句,内存 heap 中开辟地址放 ['视频'], 然后 stack中放入引用地址 视频 指向刚才的 heap
  2. var k = {视: 视频, a: 视频} 这句,首先heap中开辟地址放新的 object ,下标 a 都指向第一句 heap 中的地址,然后Stack k 指向这个 object
  3. var k1 = {a: '视频', b: '视频'} 这句,首先heap中开辟地址放新的 object,里面包含两个基本类型的属性a 和 b, 不存在引用,然后Stack k 指向这个 object

所以,第二个问题内存开辟是不一样的。如果硬要说谁多谁少,k = {视: 视频, a: 视频} 这句话少一点

另外有人对js array 内存分配做了源码层级的分析,建议看看:
深入理解 JS 数组 —— JS的Array在内存上分配的空间是连续的吗?

基本类型赋值即拷贝,所以不是引用。

你知道吗?

宣传栏