JavaScript 中有多少数据类型,它们是什么,什么被认为是一种类型?

时间:2021-04-29 11:01:50

标签: javascript types

我很好奇 JS 中有多少类型,因为我从其他可靠的来源阅读了相互矛盾的答案:

如果我们看一下 ECMAScript spec,有 8 种类型:

  • 未定义、空、布尔值、字符串、符号、数字、BigInt 和对象

似乎 function 被视为对象。


如果我们看看 MDN,他们说有 9 种类型:

六种原始数据类型,由 typeof 运算符检查:

  1. undefined : typeof instance === "undefined"
  2. Boolean : typeof instance === "boolean"
  3. Number : typeof instance === "number"
  4. String : typeof instance === "string"
  5. BigInt : typeof instance === "bigint"
  6. 符号:typeof instance === "符号"

结构类型:

  1. Object : typeof instance === "object"。任何构造对象实例的特殊非数据但结构类型也用作数据结构:新对象、新数组、新地图、新集、新 WeakMap、新 WeakSet、新日期和几乎所有用 new 关键字制作的东西;
  2. Function : 一个非数据结构,虽然它也回答 typeof 操作符:typeof instance === "function"。这只是 Functions 的一种特殊简写,尽管每个 Function 构造函数都派生自 Object 构造函数。

结构根基元:

  1. null : typeof instance === "object"。特殊的原始类型对其值有额外的用途:如果对象没有被继承,则显示为 null;

以下哪个是正确的?

1 个答案:

答案 0 :(得分:4)

当前版本的 ECMAScript 规范定义了 8 种值类型:

  1. 未定义
  2. 布尔值
  3. 字符串
  4. 符号
  5. 数量
  6. BigInt
  7. 对象

https://262.ecma-international.org/11.0/#sec-ecmascript-language-types

typeof 运算符是 JavaScript 中的一大混淆源,因为它返回的总是值的实际类型。 typeof(https://262.ecma-international.org/11.0/#sec-typeof-operator)的转换表是这样的

<头>
val 的类型 结果
未定义 undefined
object !!!
布尔值 boolean
数量 number
字符串 string
符号 symbol
BigInt bigint
对象(不实现[[Call]]) object
对象(实现 [[Call]]) function !!!

注意用 !!! 标记的两个例外

更让我们困惑的是,该语言还为这 4 种原始类型提供了包装函数

  1. 布尔值
  2. 数量
  3. 字符串
  4. BigInt

这些功能

  • 当使用 new 调用时,返回它们的参数转换为相应的包装对象(BooleanNumber 等)

  • 在没有 new 的情况下调用时,返回它们的参数转换为相应的原始值(布尔值、数字等)

当在“对象”上下文(例如 new)中使用原语时,这些函数也被隐式调用(在 "foo".length 或“构造函数”模式下)

相关问题