let a={};
那么a中实际存储的是a的是对象的引用还是指针?引用和指针有什么区别?
这是一个比较叫真的问题,首先在 JS 当中是没有引用和指针的概念的。JS 中只有引用类型(对象、数组等),且 JS 函数都是按值传递参数,如果类比 C++ 来分析,我们可以先看一下 C++ 中引用和指针的区分, https://www.zhihu.com/questio...。
可以看出,指针指的是一个存储数据地址的对象(C++ 中的对象指一块能存储数据并具有某种类型的内存空间),而引用指的是变量的别名,本身实现方式和指针常量没有太大区别。而引用具有的几个特点:定义时必须被初始化,且后续不可变。而指针变量的话或许可以改变,定义时也不要求非要初始化。
所以类比来看,可以看出首先 a 肯定不是引用,因为 a 不仅没有要求必须初始化,且后续也是可变的。那可以说 a 是指针吗?如果类比 C++ 来看,也不是太合适,首先 a 存储的肯定是指向对象的一个数据地址,但我们在 JS 层面无法通过任何方式获取到这个地址,而只能修改这个地址对应的数据,即指针 *p 的效果,但没有 p 的效果,所以他也不是传统意义上的指针。但抛开这点来看,还是和指针具有很多类似的地方,比如都不是对象本身,而是指向其地址,通过这个变量来修改引用类型的值的时候,指向同一个引用类型的其他变量,输出的值也都会受影响。
结论,指针和引用都不是 JS 中引入的概念,但从实现的效果上来看,a 更类似于一个指针。a 存储的既不是指针也不是引用,而是对象的内存地址,但这个内存地址并不能直接访问到,只能用于修改对应内存地址里的对象。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
请结合 @紅白 给出的答案参考一下,首先
Object
类型是一种引用类型,a
是一个变量,js中的变量没有类型。变量存储在栈内存中,因为Object类型是可变的,所以需要存储在堆内存中。变量a
和{}
是绑定关系,概念不同于C++中的引用。