我在服务类中有以下代码:
count: number;
increment() {
this.count++;
console.log(this.count);
}
日志输出NaN
。
我想知道为什么在声明中指定类型时,为什么计数不会初始化为0
。我已将其替换为count = 0
,但我只是想知道它背后的逻辑是什么。
答案 0 :(得分:0)
现在不确定。这就是javascript的工作方式,直到您定义了一个未定义的变量...
如果您要从0开始计数,只需将变量值设置为0 ...
示例:count: number = 0;
答案 1 :(得分:0)
如果您来自Java,则期望boolean
变量的默认值为false
。
类似地,在JavaScript中也存在默认值 ,它是undefined
的原始值。 TypeScript仅使用JavaScript data types,并且不会更改行为。
因此,任何已定义但未分配的变量都将默认为undefined
(而不是null
;与Java不同)
在MDN上阅读:https://developer.mozilla.org/en-US/docs/Glossary/Undefined
答案 2 :(得分:0)
这与Angular无关。当您定义变量时,JavaScript本身不会初始化值,JavaScript只会将该变量作为任何类型的变量进行分配。
您实际上是用TypeScript编写的,它当然是JavaScript的Typed超集以及所有
count: number;
要做的是分配变量count
并将其指定为类型number
。开发人员必须自己初始化变量,因为在许多情况下,您不希望初始化变量。
因此,例如在Vue中,有一个@Prop()
装饰器,您可以使用它来装饰从父组件到子组件的数据。
示例:
@Prop(String)
public title?: string
因此,在这里我们没有理由为该变量分配一个值,因为它将从父组件向下传递并重写此值。
在许多情况下,您不希望使用值初始化变量,请记住,这可能会导致产生未定义的值,如果不处理,可能会引起问题。但是,如果您在Visual Studio Code或任何其他可扩展的编辑器中使用TSLint之类的东西,则需要处理时会看到。
public exampleFunction() {
// if you try and use title here it may be undefined
if (!this.title) {
return
}
// after you check to make sure that title is not undefined you can be sure it's safe to use it
}
总而言之,使语言不自动初始化变量可以提高语言的可写性并减少不必要的操作。