Javascript 中变量的默认数据类型是什么?

What is the default data-type for variables in Javascript?

我正在努力学习应用意义上的 Javascript,而不仅仅是学习它的 'theory'。

我写的部分代码如下:

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 支持 变量类型 。它根据运行时变量的值修改变量的数据类型。

例如,如果您使用一些 'string' 值初始化变量,例如 -

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

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

count = 23        // data type of count becomes number

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

所以在你写的情况下:let count;
这等于:

let count = undefined;

希望这能澄清您的疑问。

用 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

正如@Jaromanda 之前在评论中所说,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中,+运算符用于数字加法和字符串连接。当您将数字 "add" 转换为字符串时,解释器会将您的数字转换为字符串并将两者连接在一起。 因此,由于 count 的类型是 string,在此count + 1 操作 JS 本身也将 1 视为字符串。


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

很简单,我们应该始终牢记,每当我们定义一个变量时,我们也应该通过给它赋值来表明它的类型。