为什么修改variants2会改变variants的值?和引用传递有关吗?二者有何区别
运行差异核心原理说明
第一段Map赋值修改同步问题
Dart 中Map属于引用类型:
- 你定义的
variants变量本身并不存储Map的实际键值对数据,只存储堆内存中存放该Map实体的内存地址 - 执行
variants2 = variants时,只是把variants持有的内存地址复制给了variants2,两个变量指向堆内存中的同一个Map对象 - 后续通过
variants2修改Map内部的键值,本质是修改公共内存地址里的内容,所以通过variants读取时也会拿到修改后的结果
这个逻辑和引用传递的规则完全一致,赋值操作仅复制引用地址,不会额外克隆一份完整的Map数据。
第二段double赋值互不影响问题
Dart 中double属于值类型:
- 你定义的
var1变量直接存储5.5这个实际数值,数据存放在栈内存中 - 执行
var2 = var1时,是直接把5.5这个数值完整复制一份,存入var2对应的独立栈内存空间 - 后续修改
var2的数值只是修改它自己对应内存空间的数据,和var1没有关联,所以var1的值不会发生变化
两段代码的核心差异
两种行为的本质是操作的变量类型不同:
- 引用类型(包括Map、List、自定义类实例等):变量存储的是数据的内存地址,修改地址指向的实际内容会影响所有持有该地址的变量
- 值类型(包括int、double、bool、String等):变量存储的是实际数据本身,赋值时会复制完整数据,不同变量的修改完全隔离
内容的提问来源于stack exchange,提问作者Ahmed Abd El-Moez
相关产品推荐
相关产品推荐

