我们需要初始化一个数组吗?

时间:2019-01-07 15:33:39

标签: javascript typescript

今天,当我阅读PrimeNg's源代码时,注意到一件事。某个utils类(ObjectUtils)的作者在某些情况下初始化了数组,而在其他情况下则未初始化。

示例1 来自源代码:

public static generateSelectItems(val: any[], field: string): SelectItem[] {
    let selectItems: SelectItem[];
    if(val && val.length) {
        selectItems = [];
        for(let item of val) {
            selectItems.push({label: this.resolveFieldData(item, field), value: item});
        }
    }

    return selectItems;
}

示例2 来自源代码:

public static filter(value: any[], fields: any[], filterValue: string) {
    let filteredItems: any[] = [];
    let filterText = this.removeAccents(filterValue).toLowerCase();

    if(value) {
        for(let item of value) {
            for(let field of fields) {
                let fieldValue = this.removeAccents(String(this.resolveFieldData(item, field))).toLowerCase();
                if(fieldValue.indexOf(filterText) > -1) {
                    filteredItems.push(item);
                    break;
                }
            }
        }
    }

    return filteredItems;
}

在第二个示例中,他初始化了数组filteredItems,但没有初始化(selectItems数组)。我想知道他为什么这样做,是否有关于此的最佳实践。

1 个答案:

答案 0 :(得分:2)

此行:

let selectItems: SelectItem[];

声明一个变量,但不创建数组。 (它不使用任何变量初始化变量。)之后,使用[]在此处创建数组:

selectItems = [];
// -----------^^

...然后分配给变量。

此行:

let filteredItems: any[] = [];

...通过提供变量初始值设定项将这两个步骤组合在一起。

要理解的关键是,第一个示例中的selectItems根本不包含任何东西,直到为其分配了某些东西。并不是程序员“没有初始化 array ”,而是他/她还没有初始化 variable

在声明变量时不必初始化变量。没有初始化程序的letvar声明都将变量初始化为undefined(在不同的时间,但这并不重要)。 (声明时,您要做需要初始化用const声明的常量,因为您以后不能赋给它。)


在您询问的评论中:

  

但是在第一个示例中,当此if(val && val.length)失败时,该函数将返回undefined。如果返回一个空数组会更好吗?

这完全取决于程序员希望val虚假或伪造length时发生什么。我确定在某些情况下会返回undefined和返回空数组。

但是,您可能想知道有关函数上的类型注释说它返回undefined时返回SelectItem[]的问题。请记住,默认情况下,nullundefined是每种类型的有效成员。您可以使用strictNullChecks选项(即documented)将其关闭:

  

在严格的null检查模式下,nullundefined值不在每种类型的域中,只能分配给自己和any(一个例外undefined也可以分配给void)。

strictNullChecks确实会使该函数出错。比较这段代码:

function foo(bar: boolean) : Date {
    let x : Date;

    if (bar) {
        x = new Date();
    }

    return x;
}
foo(Math.random() < 0.5);

使用“选项”按钮{/ 3}尝试启用/禁用 strictNullChecks:启用TypeScript会标记错误。