为啥我在构造函数中填充的这个数组在构造函数返回后没有填充?

Posted

技术标签:

【中文标题】为啥我在构造函数中填充的这个数组在构造函数返回后没有填充?【英文标题】:Why is this array that I populate in the constructor not populated after the constructor returns?为什么我在构造函数中填充的这个数组在构造函数返回后没有填充? 【发布时间】:2022-01-12 17:47:51 【问题描述】:

我想输出一个随机值数组和阶乘数组。

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] []

为什么第二个数组是空的?

【问题讨论】:

【参考方案1】:

因为

NumbersFact = this.factorial(Numbers);

将函数调用的结果分配给NumbersFact 方法参数,而不是this.NumbersFact

原因

Numbers = this.fill(Numbers);

似乎 做正确的事是因为与 factorial 方法不同,fill 修改了您作为 arg 传入的空数组。您之前已将该数组分配给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 的返回值也被分配给了一个方法参数,而不是this.Numbers

换句话说,第一个数组由于错误的原因不为空。

经验教训:

    您的数组方法应该修改它们的输入并返回 void,或者它们应该返回新数组并保持其输入不变。

    此规则的唯一例外是创建可链接的方法/函数。

    了解数组变量是引用,就像对象变量一样。他们不保存实际的数组。

【讨论】:

@Danila-Maslov 很高兴我能帮上忙。规范是对答案进行投票并接受;)

以上是关于为啥我在构造函数中填充的这个数组在构造函数返回后没有填充?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 从多个数组填充对象构造函数

在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?

为啥这个非常简单的构造函数会导致段错误?

C# void函数传入集合参数排序后没效果为啥

为啥不接受 Map 构造函数的可迭代元组数组?

在构造函数中调用异步方法?