今天,当我阅读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
数组)。我想知道他为什么这样做,是否有关于此的最佳实践。
答案 0 :(得分:2)
此行:
let selectItems: SelectItem[];
声明一个变量,但不创建数组。 (它不使用任何变量初始化变量。)之后,使用[]
在此处创建数组:
selectItems = [];
// -----------^^
...然后分配给变量。
此行:
let filteredItems: any[] = [];
...通过提供变量初始值设定项将这两个步骤组合在一起。
要理解的关键是,第一个示例中的selectItems
根本不包含任何东西,直到为其分配了某些东西。并不是程序员“没有初始化 array ”,而是他/她还没有初始化 variable 。
在声明变量时不必初始化变量。没有初始化程序的let
和var
声明都将变量初始化为undefined
(在不同的时间,但这并不重要)。 (声明时,您要做需要初始化用const
声明的常量,因为您以后不能赋给它。)
在您询问的评论中:
但是在第一个示例中,当此
if(val && val.length)
失败时,该函数将返回undefined
。如果返回一个空数组会更好吗?
这完全取决于程序员希望val
虚假或伪造length
时发生什么。我确定在某些情况下会返回undefined
和返回空数组。
但是,您可能想知道有关函数上的类型注释说它返回undefined
时返回SelectItem[]
的问题。请记住,默认情况下,null
和undefined
是每种类型的有效成员。您可以使用strictNullChecks
选项(即documented)将其关闭:
在严格的
null
检查模式下,null
和undefined
值不在每种类型的域中,只能分配给自己和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会标记错误。