☰
Modern JavaScript Tutorial 精读:JavaScript 的 8 种数据类型与 typeof 运算符全解析
2026/9/30 1:53:08 网站建设 项目流程
  • 文档/教程
  • 前端

【免费下载链接】en.javascript.info

Modern JavaScript Tutorial

项目地址:https://gitcode.com/gh_mirrors/en/en.javascript.info
点击查看免费下载

JavaScript 中的每一个值都属于某一种数据类型,例如字符串或数字。本篇基于《Modern JavaScript Tutorial》(本仓库即其英文源文档,核心内容见 1-js/02-first-steps/05-types/article.md),系统讲解 JavaScript 的 8 种基本数据类型——number、bigint、string、boolean、null、undefined、symbol 与 object,以及用于判断变量类型的typeof运算符。读完本篇,你将掌握每种数据类型的取值边界、特殊值(如NaN、Infinity)、字符串的三种引号差异,并能用typeof准确识别任意值的运行时类型。

动态类型:变量本身不绑定类型

JavaScript 是一门**动态类型(dynamically typed)**语言:语言中确实存在数据类型,但变量并不会被绑定到某一种类型上。同一个变量,某一时刻可以存放字符串,下一秒又可以存放数字:

// 不会报错 let message = "hello"; message = 123456;

这正是与 C、Java 等静态类型语言的核心差异:类型属于值,而不属于变量。在后面的章节中,我们将看到类型转换(1-js/02-first-steps/07-type-conversions/article.md)正是基于这一特性运作的。

JavaScript 共有 8 种基本数据类型,其中 7 种为原始类型(primitive),1 种为非原始类型(object)。下面逐一展开。

number:整数与浮点数,以及三个特殊数值

number类型同时表示整数和浮点数:

let n = 123; n = 12.345;

针对数字的运算非常丰富:乘法*、除法/、加法+、减法-等等。除了常规数字,number类型还包含三个"特殊数值":Infinity、-Infinity和NaN。

Infinity:大于一切数的无穷大

Infinity表示数学上的无穷大 ∞,它是一个大于任何数字的特殊值。可以通过"除以零"得到,也可以直接引用:

alert( 1 / 0 ); // Infinity alert( Infinity ); // Infinity

NaN:计算错误的结果

NaN(Not a Number)代表一次计算错误,通常是不正确或未定义的数学运算的结果:

alert( "not a number" / 2 ); // NaN,这样的除法是错误的

NaN具有"粘性":任何对NaN的后续数学运算都会返回NaN:

alert( NaN + 1 ); // NaN alert( 3 * NaN ); // NaN alert( "not a number" / 2 - 1 ); // NaN

也就是说,只要数学表达式中出现一个NaN,它就会传播到整个结果(唯一的例外是NaN ** 0结果为1)。

数学运算是"安全"的在 JavaScript 中做数学运算是安全的:除以零、把非数字字符串当数字处理都不会导致脚本以致命错误终止。最坏的结果不过是得到一个NaN。这一点与许多会抛出运行时异常的语言截然不同。

需要说明的是,Infinity、NaN虽然在形式上属于number类型,但它们并非通常意义上的"数字"。有关数字的深入操作,参见 1-js/02-first-steps/05-types/../..//05-data-types/02-number/article.md(仓库中的 Number 章节)。

bigint:任意长度的整数

number类型无法安全表示绝对值大于(253-1)(即9007199254740991)的整数。严格来说,number可以存储更大的整数(最大到1.7976931348623157 × 10308),但在安全整数范围±(253-1)之外会出现精度误差,因为并非所有数字都能放进固定的 64 位存储,此时可能存储的是一个"近似值"。

例如下面两个数字(刚好超出安全范围)是相同的:

console.log(9007199254740991 + 1); // 9007199254740991 + 1 的结果 console.log(9007199254740991 + 2); // 也是 9007199254740992

换言之,所有大于253-1的奇数根本无法在number类型中精确存储。对大多数场景来说±(253-1)已经足够,但加密、微秒级时间戳等场景需要真正的超大整数——这就引入了bigint类型。

bigint是较新加入语言的类型,用于表示任意长度的整数。在整数末尾追加字母n即可创建一个 BigInt 值:

// 末尾的 "n" 表示这是一个 BigInt const bigInt = 1234567890123456789012345678901234567890n;

BigInt 并不常用,因此本文不再展开;仓库中有独立的 BigInt 专题章节,其中包含与普通数字的混合运算规则、BigInt()/Number()显式转换、比较运算等细节,需要处理超大整数时可以直接阅读。

string:字符串与三种引号

JavaScript 中的字符串必须被引号包围:

let str = "Hello"; let str2 = 'Single quotes are ok too'; let phrase = `can embed another ${str}`;

JavaScript 共有 3 种引号:

  1. 双引号:"Hello"
  2. 单引号:'Hello'
  3. 反引号:`Hello`

双引号和单引号是"简单引号",两者在 JavaScript 中几乎没有任何区别。反引号则是"扩展功能引号",它允许通过${…}把变量和表达式嵌入到字符串中:

let name = "John"; // 嵌入一个变量 alert( `Hello, ${name}!` ); // Hello, John! // 嵌入一个表达式 alert( `the result is ${1 + 2}` ); // the result is 3

${…}内部的表达式会被求值,结果成为字符串的一部分——可以放变量(如name)、算术表达式(如1 + 2),或更复杂的任意表达式。但请注意:这种嵌入功能只能在反引号中生效,其他引号不具备:

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2}(双引号不生效)

没有独立的"字符"类型一些语言(如 C、Java)有单独的char字符类型。JavaScript 没有这种类型,只有唯一的string类型。字符串可以由零个字符(空字符串)、一个字符或多个字符组成。

关于反引号嵌入的实战练习,可参考本目录下的 1-string-quotes 练习题及其官方解答——题目用hello ${1}、hello ${"name"}、hello ${name}三种写法考察表达式、字符串字面量与变量在模板字符串中的求值差异。字符串的更多细节参见仓库中的 String 章节。

boolean:逻辑类型

布尔类型只有两个值:true和false。它通常用来存储"是/否"类信息:true表示"是,正确",false表示"否,不正确"。

let nameFieldChecked = true; // 是,姓名字段已被勾选 let ageFieldChecked = false; // 否,年龄字段未被勾选

布尔值也常作为比较运算的结果:

let isGreater = 4 > 1; alert( isGreater ); // true(比较结果是"是")

布尔值的深入用法参见 Logical operators 章节。

null:表示"空"或"未知"的独立类型

特殊的null值不属于前面描述的任一类型,它自成一体,是一个只包含null一个值的独立类型:

let age = null;

需要特别强调的是:在 JavaScript 中,null不是"指向不存在对象的引用",也不是其他语言里的"空指针"。它只是一个特殊值,表示"无"、"空"或"值未知"。上面的代码就是在声明:age的值是未知的。

undefined:表示"未被赋值"

特殊值undefined同样独立成类(与null一样是独立类型)。它的含义是"值未被赋值"。

如果变量已声明但未赋值,其值就是undefined:

let age; alert(age); // 显示 "undefined"

技术上,你也可以显式地把undefined赋给变量:

let age = 100; // 把值改为 undefined age = undefined; alert(age); // "undefined"

但不推荐这样做。惯例是:用null给变量赋"空"或"未知"值,而undefined保留为"未赋值"变量的默认初始值。

object 与 symbol:非原始类型与唯一标识符

object类型是特殊的:除它之外的所有类型都被称为原始类型(primitive),因为它们的值只能包含单一内容(字符串、数字等)。相比之下,对象用于存储数据集合和更复杂的实体。对象非常重要,仓库将在后续的 Object 章节中专门展开,本篇先提到这里。

symbol类型用于为对象创建唯一标识符。此处出于完整性提及,其细节同样推迟到学习对象之后再讲(参见 Symbol 章节)。

typeof 运算符:查看变量的类型

typeof运算符返回操作数的类型。当我们需要对不同类型做不同处理,或只想快速检查类型时,它非常有用。

调用typeof x会返回一个包含类型名称的字符串:

typeof undefined // "undefined" typeof 0 // "number" typeof 10n // "bigint" typeof true // "boolean" typeof "foo" // "string" typeof Symbol("id") // "symbol" typeof Math // "object" (1) typeof null // "object" (2) typeof alert // "function" (3)

最后三行需要额外解释:

  1. typeof Math返回"object":Math是提供数学运算的内置对象(详见 Number 章节),这里仅作为对象示例。
  2. typeof null返回"object":这是typeof中一个官方承认的历史性错误,源于 JavaScript 诞生早期,为保持兼容而被保留至今。null绝不是对象,它是有独立类型的特殊值,这里的typeof行为是错误的。
  3. typeof alert返回"function":因为alert是一个函数。后续章节会说明 JavaScript 中并没有独立的 "function" 类型——函数属于 object 类型,但typeof对函数特殊处理、返回"function"。这也源自 JavaScript 早期,技术上并不正确,但实践中很方便。

typeof(x) 写法

你可能还会见到另一种写法:typeof(x)。它与typeof x完全等价。需要澄清的是:typeof是运算符而非函数,这里的括号不属于typeof,只是数学分组意义上的括号。通常括号内放的是表达式(如(2 + 2)),这里只包含一个参数(x)。从语法上讲,这种写法允许在运算符和参数之间省略空格,有人喜欢这样写,但typeof x这种写法更常见。

typeof的实际应用贯穿全仓库,例如在 01-object 的 multiply-numeric 练习解答中就用typeof value === 'number'来筛选数字属性,与浏览器交互章节 alert、prompt、confirm 配合可以快速验证各类输入值的类型。

总结

JavaScript 共有 8 种基本数据类型:

  • 7 种原始类型:
    • number:任意整数或浮点数,整数受±(253-1)限制;
    • bigint:任意长度的整数;
    • string:字符串,可有零个或多个字符,没有独立的单字符类型;
    • boolean:true/false;
    • null:表示未知值——只含单一值null的独立类型;
    • undefined:表示未赋值——只含单一值undefined的独立类型;
    • symbol:用于唯一标识符。
  • 1 种非原始类型:
    • object:用于更复杂的数据结构。

typeof运算符可以查看变量中存储的是哪种类型:

  • 通常写作typeof x,typeof(x)也可;
  • 返回类型名称字符串,如"string";
  • 对null返回"object"——这是语言本身的错误,null实际上不是对象。

掌握了这 8 种类型的边界与typeof的判定规则后,就可以顺畅地进入下一章(类型转换)学习值在不同类型间的自动与显式转换。后续章节将集中讲解原始值,熟悉之后再转向对象。

  • 文档/教程
  • 前端

【免费下载链接】en.javascript.info

Modern JavaScript Tutorial

项目地址:https://gitcode.com/gh_mirrors/en/en.javascript.info
点击查看免费下载

相关推荐

上一篇:Websoft9故障排除手册:常见问题及解决方案大全
下一篇:Claude Code Router 如何从零创建并安装第一个 Wrapper 插件

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询