Dart 变量存储对值的引用
Posted
技术标签:
【中文标题】Dart 变量存储对值的引用【英文标题】:Dart Variable store reference to the value 【发布时间】:2019-06-29 22:54:51 【问题描述】:我刚开始学习 Dart。
在 Dart 之前,我使用过 javascript,并且有一些经验。
现在,我正在浏览documentation from Tutorial Point。他们提到过这样的事情
dart 中的所有变量都存储对值的引用,而不是 包含值。名为 name 的变量包含对 一个值为“Smith”的字符串对象。
在 Javascript 中,我猜数组和对象是引用类型。
意思是,如果我们做这样的事情
[更新:]这段代码sn-p不正确
let a = ["Apple", "orange"]
let b = a
a = ["Bananna"]
console.log(b) //["Bananna"]
但这可能只适用于 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
【问题讨论】:
您使用["Apple", "orange"]
然后重新分配给["Banana"]
的示例不是 javascript 的行为方式。在这种情况下,["Apple", "Orange"]
将被记录到控制台。
【参考方案1】:
Dart 中的一切都是对象。有些对象是可变的——即它们可以被修改,而有些是不可变的,即它们总是相同的值。
当您使用 var b = a;
分配时,b
和 a
将引用同一个对象,但名称 b
和 a
之间没有进一步的关联。如果您通过调用对象上的方法或分配给对象上的字段(例如 List.add
之类的东西)变异该对象,那么您将能够通过名称 b
或 @ 观察变异的对象987654330@。如果您分配给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]
【讨论】:
嘿 Nate,显然我对 javascript 的一些概念有模糊的理解。如果你能用一些代码解释你的答案,那将是一个很大的帮助 添加了一些代码示例。您也可以在 dartpad 中试用一些示例 - dartpad.dartlang.org以上是关于Dart 变量存储对值的引用的主要内容,如果未能解决你的问题,请参考以下文章