【问题标题】:What is the default data-type for variables in Javascript?Javascript 中变量的默认数据类型是什么?
【发布时间】:2020-08-19 16:03:29
【问题描述】:

我正在努力学习应用意义上的 Javascrcipt,而不仅仅是学习它的“理论”。

我写的部分代码如下:

let count;
splitStory.forEach(function(element) {
  if (overusedWords.includes(element)) {
     count = count + 1;
  }
})
console.log(count);

当我运行该函数时,它会将NaN 记录到控制台。但是,当我将let count; 更改为let count = 0 时,它会记录应记录到控制台的正确数字。据我所知,对变量使用let 声明是有效的,但在这种情况下,似乎存在问题。如果我要将count = count + 1; 替换为count = 'sample_string',它会起作用并将'sample_string' 记录到控制台。这就引出了我的问题,除非声明中另有说明,否则变量的默认数据类型是字符串吗?

【问题讨论】:

  • javascript 变量无类型 - 但let count; 等价于let count = uindefined
  • 默认的undefinedundefined + 1NaNNaN + 1 也是 NaN
  • 搜索期望有无数的重复。发现了一个骗子,它并没有完全解决这里的问题。

标签: javascript variables let


【解决方案1】:

JavaScript 支持变量类型。它在运行时根据变量的值修改变量的数据类型。

例如,如果您使用一些“字符串”值初始化变量,例如 -

let count = 'someString';   //data type would be string

稍后如果您再次分配一些数值,例如 -

count = 23        // data type of count becomes number

但是如果你不赋值,只声明变量,它的数据类型是"undefined"。

所以在你写的时候:let count;
这等于:

let count = undefined;

希望这能澄清您的疑问。

【讨论】:

    【解决方案2】:

    用 var 或 let 声明的变量的默认值是 undefined,除非你将它初始化为一个值,在这种情况下,它会获取该值的类型。如果你不初始化它,那么在它被设置为某个值之前它不会得到一个类型。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

    【讨论】:

      【解决方案3】:

      正如@Jaromanda 之前在 cmets 中所说,javascript 是一种无类型语言,或者有时可能称为弱类型(这不是一个合适的短语,因为 JS 本身不有编译器),这意味着 JavaScript 变量可以保存任何数据类型的值


      有什么问题?

      通常当您定义如下内容时:let count;count 本身将保持未初始化状态,直到您直接为其赋值。因此,在这种情况下,未赋值的 value 元素类型是undefined,它的值是undefined,那么当你尝试console.log这样的东西时,它会是未定义的,让我们看看这个例子。

      let count;
      
      console.log('count type is:', typeof count)
      console.log('count value is:', count)

      你可以看到count的类型和值都是undefined

      注意:您可以阅读this 了解更多信息。

      让我们看看你的具体例子

      let count;
      
      console.log('count type after declaration is:', typeof count);
      console.log('count value after declaration is:', count);
      
      let splitStory = ['a', 'b', 'c'];
      let overusedWords = ['d', 'b', 'e'];
      
      splitStory.forEach(function(element) {
        if (overusedWords.includes(element)) {
           count = count + 1;
        }
      })
      
      console.log('count type at the end is:', typeof count);
      console.log('count value at the end is:', count);

      那么这里发生了什么?

      正如@Patrick 之前所说的undefined + 1NaN,它是什么意思呢? NaN(表示非数字)本身是另一种数据类型(很少使用)。但是为什么undefined + 1 的结果是NaN?根据MDN只要预期的结果应该是一个数字,但由于多种情况它会失败,例如Math.sqrt(-1) 结果也将是NaN所以,在这种情况下,count + 1 的预期输出是一个数字,因为我们正在进行算术运算并希望将count 的值增加1,所以因为count值本身是undefined,不可能进行自增操作(因为undefined是不可配置的属性),所以结果会是NaN


      让我们进入你的第二个子句。

      let count = 'sample_string';
      
      console.log('count type after declaration is:', typeof count);
      console.log('count value after declaration is:', count);
      
      let splitStory = ['a', 'b', 'c'];
      let overusedWords = ['d', 'b', 'e'];
      
      splitStory.forEach(function(element) {
        if (overusedWords.includes(element)) {
          count = count + 1;
        }
      })
      
      console.log('count type at the end is:', typeof count);
      console.log('count value at the end is:', count);

      这里发生了什么?

      输出是sample_string1 为什么?简短的回答是它们会连接起来。

      在 JavaScript 中,+ 运算符用于数字加法和字符串连接。当您将数字“添加”到字符串时,解释器会将您的数字转换为字符串并将两者连接在一起。因此,由于count 的类型是string,因此在此count + 1 操作中JS 自己认为1 也是一个字符串。


      我们应该怎么做才能防止这种事情发生?

      这很简单,我们应该始终牢记,每当我们定义一个变量时,我们还应该通过为其赋值来指示其类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-18
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        相关资源
        最近更新 更多