JavaScript 列表差异

*列表按值复制和比较*

在 JavaScript 中,列表按引用复制和比较。在 DScript 中,列表是一种基本数据类型,像数字和文本字符串一样按值复制和比较。

考虑以下代码示例:

var x=[1,2,3,4,5];
var y=x;
y[0]=99;

在 JavaScript 中,语句 y=x 不会将列表 x 的全部内容复制到 y 中。相反,y 的值只是指向 x 的指针。这意味着在执行语句 y[0]=99 之后,x 的值为 [99,2,3,4,5],即使 x 从未被显式修改。将此结果与使用标量的代码进行比较:

var x=1;
var y=x;
y=99;

此代码执行后,x 的值为 1,y 为 99。

在 JavaScript 中,标量按值复制,列表按引用复制。这样做是为了使列表复制更高效。然而,DScript 在仍然按值复制所有数据(包括列表)的同时实现了相同的效率。

再次考虑原始示例。这次该示例在 DScript 中运行。

var x=[1,2,3,4,5];
var y=x;
y[0]=99;

第一条语句 x=[1,2,3,4,5] 在 DScript 和 JavaScript 中的行为完全相同。在 JavaScript 中,第二条语句 y=x 将 y 设置为指向 x 的指针。DScript 也是如此。

现在,考虑最后一条语句 y[0]=99 中发生的情况。JavaScript 修改 x 和 y 都指向的列表。然而,DScript 意识到 x 和 y 指向同一个列表;因此,在修改发生之前会创建列表的副本。代码完成后,JavaScript 中 x 和 y 的值都是 [99,2,3,4,5]。在 DScript 中,x 为 [1,2,3,4,5],y 为 [99,2,3,4,5]。

DScript 保持了使用指针复制列表的效率,同时足够智能地使用指针,使结果就像列表按值复制一样。

DScript 和 JavaScript 处理列表的按引用与按值差异在比较中也很明显。例如,下面的比较语句 x==y 在 JavaScript 中求值为 false,但在 DScript 中为 true。

var x=[1,2,3,4,5];
var y=[1,2,3,4,5];
if(x==y)
    ...;

这里的差异可能看起来很微妙,但它们极其重要。在 DScript 中,列表是一种简单的数据类型,就像数字或文本字符串一样。列表像所有其他数据类型一样按值复制和比较。此功能与列表和矩阵处理相结合,极大地增强了 DScript 的能力。例如,如果你想将矩阵 B 中的所有元素添加到矩阵 A 的元素中,你会使用如下 JavaScript 代码:

for(var x=0; A[x][0]!=null; x++) {
  for(var y=0; A[x][y]!=null; y++)
    A[x][y]+=B[x][y];
}

使用 DScript,你可以用如下简单的语句做同样的事情:

A+=B;

此外,DScript 代码的执行速度约为等效 JavaScript 代码的 30 倍。

在 DScript 中,如果你想将列表指针传递给函数以便函数可以修改原始列表,只需使用 @ 字符定义函数参数,如下例所示:

Increment(@list):={
  list+=1;
}

var x=[1,2,3,4,5];
Increment(x);

列表不是稀疏的

在 JavaScript 中,列表是稀疏的,也就是说,你可以为列表中的第 100 个元素赋值,而前 99 个元素甚至不存在。在 DScript 中,只有当列表至少包含 100 个元素时,你才能为第 100 个元素赋值。