我们一起讨论一些有趣的 Dart 问题,每个人在面试之前都应该知道这些问题。
这些问题至关重要,因为它们构成了您正在学习的任何语言的基础。
我们将从第一个问题开始。
void main() { int x = 1; fun(x); print(x);}void fun(int x){ x++;}
答案是输出是 1,分析错的人,不要担心,我们来看下一个,我们将一起讨论这两个问题。
void main() { List<int> arr = [1,2,3,4,5]; fun1(arr); print(arr);}void fun(List arrayCopy){ arrayCopy.add(6);}
所以如果你认为输出是
[1,2,3,4,5]
那么你可能忽略了 Dart 中的一个关键概念。那么,这个输出到底有什么问题呢?根据问题 1 的规则,输出应该与之前一致,因为唯一的区别在于,问题 1 使用了 int 类型,而问题 2 使用了 List 类型。
但是输出是 -
[1,2,3,4,5,6]
因此,输出结果的关键在于原始数据结构与非原始数据结构之间的差异。
如果此时你恍然大悟,可能会想“我怎么没有想到呢?”那么接下来有一个奖励问题等着你。对于其他人,请继续关注,我们将逐步讨论这些问题的解决方案。
原始数据结构是 Dart 中的基础数据类型,它们非常简单,直接表示存储在内存中的单一值。以下是一些常见的例子:
非原始数据结构通常比原始数据结构更复杂,Dart 并没有直接将它们作为基本数据类型提供。它们通常由多个原始数据类型的集合或更为复杂的数据结构组成。常见的非原始数据结构包括:
其关键区别在于:
原始数据类型的值直接存储在变量的内存地址中,而非原始数据类型则存储了指向实际数据的引用。
因此,原始数据结构通过值传递,而非原始数据结构通过引用传递。
在问题 1 中,输出为 1,因为它涉及一个原始数据类型,该类型在函数中是通过值传递的。结果,创建了一个新的变量并将其传递给函数,只修改了这个新变量的值,原始值没有发生变化。
在问题 2 中,输出为 [1, 2, 3, 4, 5, 6],因为它涉及一个非原始数据类型,这个数据结构在函数中是通过引用传递的。这样,函数接收的是同一个变量的引用,因此修改会影响原始变量的值。
再来一个
void main() { List<int> arr = [1,2,3,4,5]; fun1(arr); print(arr);}void fun(List<int> arrayCopy){ List<int> arr = [...arrayCopy]; arr.add(6);}
首先想一想。输出是 [1, 2, 3, 4, 5] 提示 - 考虑扩展运算符的效果。如果您想了解有关扩展运算符的更多信息,请告诉我。