为什么我在构造函数中填充的这个数组在构造函数returns之后没有填充?
Why is this array that I populate in the constructor not populated after the constructor returns?
我想输出一个随机值数组和一个阶乘数组。
abstract class AClass {
Numbers: Array<number>;
NumbersFact: Array<number>;
constructor(Numbers: Array<number>, NumbersFact: Array<number>) {
this.Numbers = Numbers;
this.NumbersFact = NumbersFact;
for (var i = 0; i < 10; ++i) Numbers[i] = i;
Numbers = this.fill(Numbers);
NumbersFact = this.factorial(Numbers);
console.log(Numbers);
console.log(NumbersFact);
}
一切正常。
console.log 显示了两个数组
fill(array: number[]): number[] {
// Add random numbers to [Numbers]
var tmp: number, current: number, top = array.length;
if (top) while (--top) {
current = Math.floor(Math.random() * (top + 1));
tmp = array[current];
array[current] = array[top];
array[top] = tmp;
}
return array;
}
第一个随机值从 0 到 9 的数组
factorial(array: Array<number>): Array<number> {
// Create factorial's array from [Numbers].
var arrayFact = [];
for (var i = 0; i < array.length; ++i) {
const fact = (x: number) => {
return (x == 0) ? 1 : x * fact(x - 1);
}
arrayFact.push(fact(array[i]));
}
return arrayFact
}
第二个数组包含第一个数组的阶乘值
abstract sort(): void;
}
class Class1 extends AClass {
sort(): void { }
}
var test = new Class1([], []);
console.log(test);
console.log(test.Numbers);
console.log(test.NumbersFact);
结果
console.log 在构造函数中:
- (10) [0, 8, 4, 6, 3, 7, 1, 9, 2, 5],
- (10) [1, 40320, 24, 720, 6, 5040, 1, 362880, 2, 120]。
consol.log最后的代码:
- Class1 {Numbers: Array(10), NumbersFact: Array(0)}
- (10) [0, 8, 4, 6, 3, 7, 1, 9, 2, 5]
- []
为什么第二个数组是空的?
因为
NumbersFact = this.factorial(Numbers);
将函数调用的结果分配给 NumbersFact
方法参数,而不是 this.NumbersFact
.
原因
Numbers = this.fill(Numbers);
似乎做正确的事情是因为与factorial
方法不同,fill
修改了空您作为参数传入的数组。您之前将该数组分配给 this.Numbers
:
this.Numbers = Numbers; // assigned an empty array that gets updated later in the ctor
this.NumbersFact = NumbersFact; // assigned an empty array that stays empty
fill
的 return 值也分配给方法参数,而不是 this.Numbers
。
换句话说,由于错误的原因,第一个数组不为空。
要吸取的教训:
您的数组方法应该修改其输入并 return void,或者它们应该 return 新数组并保持其输入不变。
此规则的唯一例外是创建可链接的 methods/functions。
了解数组变量是引用,就像对象变量一样。它们不包含实际数组。
我想输出一个随机值数组和一个阶乘数组。
abstract class AClass {
Numbers: Array<number>;
NumbersFact: Array<number>;
constructor(Numbers: Array<number>, NumbersFact: Array<number>) {
this.Numbers = Numbers;
this.NumbersFact = NumbersFact;
for (var i = 0; i < 10; ++i) Numbers[i] = i;
Numbers = this.fill(Numbers);
NumbersFact = this.factorial(Numbers);
console.log(Numbers);
console.log(NumbersFact);
}
一切正常。 console.log 显示了两个数组
fill(array: number[]): number[] {
// Add random numbers to [Numbers]
var tmp: number, current: number, top = array.length;
if (top) while (--top) {
current = Math.floor(Math.random() * (top + 1));
tmp = array[current];
array[current] = array[top];
array[top] = tmp;
}
return array;
}
第一个随机值从 0 到 9 的数组
factorial(array: Array<number>): Array<number> {
// Create factorial's array from [Numbers].
var arrayFact = [];
for (var i = 0; i < array.length; ++i) {
const fact = (x: number) => {
return (x == 0) ? 1 : x * fact(x - 1);
}
arrayFact.push(fact(array[i]));
}
return arrayFact
}
第二个数组包含第一个数组的阶乘值
abstract sort(): void;
}
class Class1 extends AClass {
sort(): void { }
}
var test = new Class1([], []);
console.log(test);
console.log(test.Numbers);
console.log(test.NumbersFact);
结果
console.log 在构造函数中:
- (10) [0, 8, 4, 6, 3, 7, 1, 9, 2, 5],
- (10) [1, 40320, 24, 720, 6, 5040, 1, 362880, 2, 120]。
consol.log最后的代码:
- Class1 {Numbers: Array(10), NumbersFact: Array(0)}
- (10) [0, 8, 4, 6, 3, 7, 1, 9, 2, 5]
- []
为什么第二个数组是空的?
因为
NumbersFact = this.factorial(Numbers);
将函数调用的结果分配给 NumbersFact
方法参数,而不是 this.NumbersFact
.
原因
Numbers = this.fill(Numbers);
似乎做正确的事情是因为与factorial
方法不同,fill
修改了空您作为参数传入的数组。您之前将该数组分配给 this.Numbers
:
this.Numbers = Numbers; // assigned an empty array that gets updated later in the ctor
this.NumbersFact = NumbersFact; // assigned an empty array that stays empty
fill
的 return 值也分配给方法参数,而不是 this.Numbers
。
换句话说,由于错误的原因,第一个数组不为空。
要吸取的教训:
您的数组方法应该修改其输入并 return void,或者它们应该 return 新数组并保持其输入不变。
此规则的唯一例外是创建可链接的 methods/functions。
了解数组变量是引用,就像对象变量一样。它们不包含实际数组。