Dart 变量存储对值的引用

iRo*_*tia 3 javascript dart

我刚开始学习 Dart。

在使用 Dart 之前,我曾使用过 Javascript 并有一些经验。

现在,当我浏览Tutorial Point文档时。他们提到过这样的事情

dart 中的所有变量都存储对该值的引用,而不是包含该值。名为 name 的变量包含对值为“Smith”的 String 对象的引用。

在 Javascript 中,我猜数组和对象是引用类型。

意思是,如果我们做这样的事情

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

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

let b = a 

a = ["Bananna"] 

console.log(b) //["Bananna"]
Run Code Online (Sandbox Code Playgroud)

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

let a = 5
let b = a 
a = 7
console.log(b) //5 
Run Code Online (Sandbox Code Playgroud)

从报价来看,

dart 中的所有变量都存储了对该值的引用

[问题:]这是否意味着即使像 int、string.. 和我们在 Dart 中创建的每个变量都是引用?并且上述代码的等价物将在 Dart 中打印 7 或者我有什么问题(通常)?

let a = 5
let b = a 
a = 7
console.log(b) //7
Run Code Online (Sandbox Code Playgroud)

Nat*_*sch 8

在 Dart 中,一切都是对象。有些对象是可变的 - 即它们可以被修改,而有些是不可变的,即它们将始终具有相同的值。

当你将与var b = a;双方ba会引用同一个对象,但名称之间无关联进一步ba。如果您通过在对象上调用方法或为其分配字段(例如,诸如此类)来改变该对象,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]
Run Code Online (Sandbox Code Playgroud)

有突变:

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]
Run Code Online (Sandbox Code Playgroud)

  • 添加了一些代码示例。您还可以在 dartpad 中尝试一些示例 - https://dartpad.dartlang.org/ (3认同)