Javascript 我们需要初始化数组吗?
今天当我阅读源代码时,注意到一件事。一个utils类()的作者在某些情况下初始化了数组,但在其他情况下没有初始化 示例1源代码:Javascript 我们需要初始化数组吗?,javascript,typescript,Javascript,Typescript,今天当我阅读源代码时,注意到一件事。一个utils类()的作者在某些情况下初始化了数组,但在其他情况下没有初始化 示例1源代码: public static generateSelectItems(val: any[], field: string): SelectItem[] { let selectItems: SelectItem[]; if(val && val.length) { selectItems = []; for
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;
}
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;
}
示例2源代码:
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;
}
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
array)。我想知道他为什么这么做,是否有关于这方面的最佳实践。这一行:
let selectItems: SelectItem[];
let filteredItems: any[] = [];
声明变量,但不创建数组。(它不会用任何东西初始化变量。)稍后,使用[]
创建数组,如下所示:
selectItems = [];
// -----------^^
…然后分配给变量
这一行:
let selectItems: SelectItem[];
let filteredItems: any[] = [];
…通过提供变量初始值设定项来组合这两个步骤
要理解的关键是,第一个示例中的selectItems
不包含任何内容,除非为其分配了某些内容。所以不是程序员“没有初始化数组”,而是他/她没有初始化变量
声明变量时不必初始化它。let
和var
声明都在没有初始值设定项的情况下将变量初始化为undefined
(在不同的时间,但这在这里并不重要)。(在声明常量时,确实需要初始化使用const
声明的常量,因为之后无法对其赋值。)
你在评论中问: 但是,如果在第一个示例中(val&&val.length)失败,则函数将返回
未定义的。如果它返回空数组不是更好吗
这完全取决于当val
为falsy或长度为falsy时程序员希望发生什么。我确信返回未定义的
和返回空数组都有用例
但是,当函数上的类型注释显示它返回SelectItem[]
时,您可能想知道如何返回undefined
。请记住,默认情况下,null
和undefined
实际上是每种类型的成员。您可以使用strictNullChecks
选项将其关闭,如下所示:
在严格的null
检查模式下,null
和undefined
值不在每种类型的域中,只能分配给它们自己和any
(一个例外是undefined
也可以分配给void
)
stricnullchecks
确实会使该函数出错。比较此代码:
function foo(bar: boolean) : Date {
let x : Date;
if (bar) {
x = new Date();
}
return x;
}
foo(Math.random() < 0.5);
函数foo(条形图:布尔值):日期{
x:日期;
如果(巴){
x=新日期();
}
返回x;
}
foo(Math.random()<0.5);
尝试使用选项按钮启用/禁用
stricnullchecks
:TypeScript在启用时会标记一个错误。你应该用TypeScript
标记它,而不是用javascript
@Xatenev标记它-我认为大家的共识是,用TypeScript标记问题是可以的,因为它们通常是关于javascript的,而不是关于TypeScript的。(但无论是否标记,都必须标记。)但当第一个示例中的if(val&&val.length)
失败时,函数将返回未定义的。如果它返回一个空数组不是更好吗?@Gabriel这可能正是作者的意图。@Gabriel-这完全取决于当val
为falsy或长度为falsy时程序员希望发生什么。我在答案的末尾添加了这个问题,以及为什么声明为返回SelectItem[]
的函数不会(或是)出现问题。(为了纠正我在回答中其他地方犯的愚蠢错误。)