Dart变量存储对值的引用

c90pui9n  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(138)

我刚开始了解达特。
在Dart之前,我使用过Javascript,并有一些经验。
现在,当我在浏览documentation from Tutorial Point时,他们提到了类似的内容
dart中的所有变量都存储对值的引用而不是包含值。名为name的变量包含对值为“Smith”的String对象的引用。
在Javascript中,我猜数组和对象都是引用类型。
意思是,如果我们这么做

[更新:]此代码片段不正确

let a = ["apple", "orange"]

let b = a 

a = ["banana"] 

console.log(b) //["banana"]

但这可能只适用于JS中的对象和数组(而不适用于const和let)

let a = 5
let b = a 
a = 7
console.log(b) //5

从这句话中,
Dart中的所有变量都存储对该值的引用

**[问题:]**这是否意味着,即使像int、string..和我们在Dart中创建的每个变量都是引用?上面代码的等价物在Dart中也会打印7,或者我(一般)有什么地方出错了?

let a = 5
let b = a 
a = 7
console.log(b) //7
elcex8rz

elcex8rz1#

在 dart 中,每件事物都是一个对象。有些对象是可变的--也就是说它们可以被修改,有些是不可变的,也就是说它们总是相同的值。
当您使用var b = a;赋值时,ba将引用同一对象,但是在名称ba之间没有进一步的关联。如果您通过调用Object上的方法或为Object上的字段赋值来 * 改变 * 该Object(例如List.add),那么你就可以通过名称ba来观察变异对象。如果你 * 赋值 * 变量a,那么变量b不受影响,这在javascript中也是一样的。
有些类型,如数字或字符串,看起来特别的原因是它们不能被改变,所以“改变”a的唯一方法是重新分配它,这不会影响b。其他类型,如集合,是可变的,所以a.add("Banana")是一个变化,通过引用该列表的任何变量都可以看到。
例如,对于赋值:

var a = ['Apple', 'Orange'];
var b = a;
a = ['Banana']; // Assignment, no impact to b
print(a); // [Banana]
print(b); // [Apple, Orange]

有突变:

var a = ['Apple', 'Orange'];
var b = a;
a.clear(); // Mutation, the _list instance_ is changed
a.add('Banana')  // Another mutation
print(a); // [Banana]
print(b); // [Banana]

相关问题