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; 分配时,ba 将引用同一个对象,但名称 ba 之间没有进一步的关联。如果您通过调用对象上的方法或分配给对象上的字段(例如 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 变量存储对值的引用的主要内容,如果未能解决你的问题,请参考以下文章

深入思考右值引用

C#中的引用传递值传递

C#------值类型与引用类型

21 re正则模块 垃圾回收机制

C#基础按值和按引用传递参数

理解栈堆值类型引用类型装箱和拆箱