- 文档/教程
- 前端
【免费下载链接】en.javascript.info
Modern JavaScript Tutorial
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 ); // InfinityNaN:计算错误的结果
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 种引号:
- 双引号:
"Hello" - 单引号:
'Hello' - 反引号:
`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)最后三行需要额外解释:
typeof Math返回"object":Math是提供数学运算的内置对象(详见 Number 章节),这里仅作为对象示例。typeof null返回"object":这是typeof中一个官方承认的历史性错误,源于 JavaScript 诞生早期,为保持兼容而被保留至今。null绝不是对象,它是有独立类型的特殊值,这里的typeof行为是错误的。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
相关推荐
Ventoy终极指南:3步创建万能启动盘,一U盘装下所有系统
Ventoy终极指南:3步创建万能启动盘,一U盘装下所有系统 还在为每次重装系统都要重新制作启动盘而烦恼吗?Ventoy多系统启动盘工具彻底改变了传统启动盘的制
操作系统固件开发工具30-seconds-of-interviews 系列精讲:JavaScript 数据类型全解析(七种内置类型、原始值 vs 对象与 typeof 陷阱)
30 seconds of interviews 系列精讲:JavaScript 数据类型全解析(七种内置类型、原始值 vs 对象与 typeof 陷阱) 本文
教程前端如何为hoverboard-firmware-hack-FOC添加GPS定位功能:位置追踪与地理围栏实现
如何为hoverboard firmware hack FOC添加GPS定位功能:位置追踪与地理围栏实现 hoverboard firmware hack FO
嵌入式硬件开发智能硬件物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考