【问题标题】:Why isn't a number type initialized to 0?为什么数字类型不初始化为 0?
【发布时间】:2019-06-13 02:35:05
【问题描述】:

我在服务类中有以下代码:

count: number;

increment() {
  this.count++;
  console.log(this.count);
}

日志输出NaN

我想知道为什么当我在声明中指定类型时它不会将 count 初始化为 0。我已将其替换为 count = 0,但我只是好奇其背后的逻辑。

【问题讨论】:

  • 因为对象具有我们可以依赖的空值是很实用的。在 JavaScript 中,整数只是一个开始的对象,它只是一个你可以操作并影响它的数字。
  • 如果您正在编写 typescript,请标记 Typescript,因为我在这里没有看到任何与 Angular 相关的内容,我还建议您不要包含该标记(即它与 Typescript 类无关是一个 Typescript 类)。
  • 好吧,这里甚至不是打字稿,而是更多关于 JavaScript 和一般对象的内容。

标签: javascript typescript undefined nan


【解决方案1】:

这与 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
}

总而言之,让语言不自动初始化变量会增加语言的可写性并减少不必要的操作。

【讨论】:

    【解决方案2】:

    如果您来自 Java,您会期望 boolean 变量具有默认值 false

    同样,在 JavaScript 中,默认值 确实 存在,即 undefined 的原始值。 TypeScript 只使用 JavaScript data types 并不会改变行为。

    因此,任何已定义但未分配的变量都将默认为 undefined(而不是 null;与 Java 不同)

    阅读 MDN:https://developer.mozilla.org/en-US/docs/Glossary/Undefined

    【讨论】:

      【解决方案3】:

      现在未定义。这就是 javascript 的工作原理,直到你定义了一个未定义的变量...

      在您的情况下,如果您想从 0 开始计数,只需将变量值设置为 0...

      示例:count: number = 0;

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 2013-07-16
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 2020-10-09
        • 1970-01-01
        相关资源
        最近更新 更多