JavasSript 很奇怪,目前在 JavasSript 中存在八种(近似)ECMAScript 语言类型(在本文发表时)。我们倾向于说 JavasSript 中的所有内容都是一个对象,但事实并非如此。实际上, 虽然在 JavasSript 中大多数东西表现得像对象,但这并不意味着它们真的是对象。因此,深入研究 JavasSript 中存在的有效类型是一件以备不时之需的好事情。
在继续之前,我想说清楚:我指的是 一般值类型 ,而不是 基本类型 的概念。如果我指的是基本类型,那么就不会讨论对象,那是需要再找一天讨论的另一种不同的 JS 问题。
那么现在,为了深入这 8 种左右的类型以及 "近似" 意义的本质,我们需要一位有帮助的朋友的指导……
来见见 BUNNSBOS!
BUNNSBOS
将帮助我们理解这些类型,如下:
-
Boolean
-
Undefined
-
Number
-
Null (近似)
-
String
-
BigInt (非官方的)
-
Object
-
Symbol
你可能会质疑是否还有其他类型没有列出。这就是短语 "表现得像对象" 所指的 — 如数组或函数等等。正如我朋友所说的那样,这些可以归类为 “奢侈对象”,值得专门用一篇文章来介绍。这里我只关注 ECMAScript 规范中已识别的类型。 ?
那么,让我们来快速过一遍这八个独特可爱的孩子。警告: 以下将是极其简化的定义。
-
Boolean:只能输出 true 或 false 值。
-
Undefined:缺省值;(或者在变量的情况下)当前没有值的变量容器。
-
Number:可以对其运行数学运算的值(使用浮点格式)。
-
Null:把这看作是另一种故意写“这里什么都没有”的方式,它与零或空不一样。 ???
-
String:只是简单的文本。
-
BigInt:一个非常大的数字系统。可以达到计算机中可分配的内存的最大容量。
-
Object:一个数据容器。
-
Symbol:可以动态生成匿名唯一值的函数。
现在我知道你在想,“ 难道 BUNNSSOB
不是比 BUNNSBOS
更有意义吗?这个缩略词中没有两个S分成两个单词”。— 我会说,“是的,但是,看看那可爱的贝雷帽!”
所以我们非常粗略地定义了八种类型。我想开始分析这些类型的奇怪部分 — 主要是 BigInt
和 Null
。我们从简单的开始:BigInt
BigInt
是 JavaScript 中的一种有效类型,或者更恰当地说,它存在于 Node 和 Chrome 的 V8 JavaScript 引擎以及 Firefox 的SpiderMonkey 引擎中。BigInt
之所以奇怪,是因为它可以被使用和测试,但并不属于 ECMAScript 规范 的正式部分。因此,使用并查询它是有效的,但它不是规范的正式部分。注意:根据 Node 或浏览器的版本,您可能无法测试 BigInt
,这就加强了在该类型上使用星号的必要性。
> typeof 143
'number'
> typeof 143n
'bigint'
现在来看超级怪异的一个:Null
。可以在 if 语句中检查 null
,但是测试null
类型会得到各种各样的结果。
> typeof null
'object'
引用前端开发大牛 Ire Aderinokun 的话来说:
在 JavaScript 的第一个实现中,值由两部分表示:类型标记和实际值。有5个类型标记可使用,而用于引用对象的标记是 0 。但是,Null 被表示为空指针,对于大多数平台来说是 0x00 。由于这种相似性,null 就有了对应于一个对象的 0 类型标记。
不幸的是,更重要的一点是 Null
输出的类型是 Object
是一个 bug。一个我们必须忍受的 bug,以免如果我们决定修复它的话,从社会的角度讲,我们就会很轻易地破坏太多的应用和网站。
所以我们现在背上了 Null
的十字架 — 带着这个十字架,我们必须面对这样一个事实,我们至少可以检查 BigInt 的类型,但是不能检查 Null 的类型。我们的新朋友,BUNNSBOS
死了,BUNSBOS
万岁。
-
Boolean
-
Undefined
-
Number
-
String
-
BigInt (非官方的)
-
Object
-
Symbol
现在,我们为小圆面包(BUNS) 哭泣(SOB)。
?
引用资源:
-
Deep JavaScript Foundations, Kyle Simpson
-
Bits of Code, Ire Aderinokun
-
还要特别感谢网友 ✊