Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我们需要初始化数组吗?_Javascript_Typescript - Fatal编程技术网

Javascript 我们需要初始化数组吗?

Javascript 我们需要初始化数组吗?,javascript,typescript,Javascript,Typescript,今天当我阅读源代码时,注意到一件事。一个utils类()的作者在某些情况下初始化了数组,但在其他情况下没有初始化 示例1源代码: public static generateSelectItems(val: any[], field: string): SelectItem[] { let selectItems: SelectItem[]; if(val && val.length) { selectItems = []; for

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

示例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;
}
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[]
的函数不会(或是)出现问题。(为了纠正我在回答中其他地方犯的愚蠢错误。)