Skip to content
This page has been auto-translated and may contain errors.View in English

数据类型

docs.scrimba.com

存储一个人的名字、他们的年龄,以及他们是否已登录,你已经使用了三种不同的值类型。名字是文本,年龄是数字,登录标志是是或否。JavaScript 将这些中的每一个视为不同的类型,并以不同的方式处理每一个。本章介绍你首先遇到的几种类型,以及如何判断你持有的是哪一种。

基本类型

三种类型涵盖了你存储的大部分内容。**字符串**是用引号括起来的文本。数字是任何数字,用于计数或测量。布尔值是一个是或否的值,它只有两个选项:truefalse

js
const name = "小王"; // 一个字符串:文本
const age = 27; // 一个数字
const isLoggedIn = true; // 一个布尔值:true 或 false

对于任何读起来像单词的内容,你使用字符串:名字、消息、颜色。对于任何你可能计数或计算的内容,你使用数字。当答案是两个选项之一时,你使用布尔值,比如一个框是否被选中。你将在字符串数字中看到更多这些内容。

JavaScript 的日常值分为几种**类型**,其中三种承载大部分数据。字符串是用引号括起来的文本,单引号或双引号都可以。数字是任何数值。布尔值是恰好两个值中的一个,truefalse

js
const productName = "无线鼠标"; // 字符串
const price = 24.99; // 数字
const inStock = true; // 布尔值

每种类型都有其作用。字符串保存你显示或读取的文本,在字符串中介绍。数字保存你计算的任何内容,在数字中介绍。布尔值保存双向答案,并在做出决定的地方出现,因为像 price < 30 这样的比较会产生一个。

JavaScript 将值排序为一小组**类型**,其中三种占了你处理数据的大部分。字符串是用引号(单引号、双引号或模板字面量的反引号)写的字符序列。数字是数值。布尔值是两个值之一,truefalse

js
const currency = "EUR"; // 字符串
const balance = 1499.5; // 数字
const isOverdrawn = balance < 0; // 布尔值,这里是比较的结果

字符串和数字之间的区别看起来比实际要重要得多,因为 "5"5 的行为不同:一个是碰巧包含数字的文本,另一个是你可以做算术的值。布尔值值得早期注意,因为你很少手动输入它们。它们来自比较和逻辑检查,所以能够将 balance < 0 读作"一个布尔值"的能力是使后来的条件和运算符落实到位的原因。

Juno基本类型 三种你经常用到的:string 代表用引号括起来的文本,number 代表任何数值,boolean 代表 truefalse 的答案。选择与你存储的事物种类相匹配的类型。名字是字符串,年龄是数字,复选框是布尔值。
Juno基本类型 三种类型做大部分工作:string 代表文本,number 代表数值,boolean 代表 truefalse。引号使得字符串成立,所以 "5" 是文本,不是数字。布尔值通常作为比较的结果出现,而不是你输入的东西。
Juno基本类型 字符串、数字和布尔值承载大部分数据,字符串与数字的界限是咬合的地方:"5" 是文本,5 是算术。你几乎永远不会写布尔值字面量,因为像 balance < 0 这样的比较会给你一个。将比较理解为"这是一个布尔值"是使后来的条件最终点击到位的原因。

无:null 和 undefined

有时值是缺失的,JavaScript 有两种方式来表达这一点。undefined 意味着还没有给定值。如果你创建一个变量而不设置它,它的值是 undefined

js
let score;
console.log(score); // undefined

null 意味着故意为空。你自己使用它,来说"这现在没有值,我是有意的"。

js
let winner = null;
console.log(winner); // null

简短版本:undefined 是 JavaScript 说"这里还没有东西",null 是你说"这里没有东西,故意的"。

两个值都代表"无值",区别在于谁设置的。undefined 是 JavaScript 默认给你的:没有值声明的变量,例如,开始是 undefined

js
let selectedColor;
console.log(selectedColor); // undefined

null 是你自己赋予的值,用来标记某些东西是故意为空,一个你清除或还没有填充的位置。

js
let couponCode = null;
console.log(couponCode); // null

undefined 是默认的缺失;null 是故意的。这种分裂是有用的理解方式:如果你看到 undefined,某些东西从未被设置;如果你看到 null,有人选择清空它。

nullundefined 都代表缺失,分离它们的惯例是关于意图的。undefined 是 JavaScript 自己产生的缺失:一个声明但未赋值的变量、一个缺失的属性、一个没有返回任何东西的函数。

js
let discount;
console.log(discount); // undefined

null 是你故意赋值的缺失,来表示"故意为空"而不是"尚未被触及"。

js
let appliedCoupon = null;
console.log(appliedCoupon); // null

将这两者分开在代码库中是真实的信号:undefined 倾向于意味着没有人设置了这个,这可能指向一个 bug 或未完成的路径,而 null 读作一个深思熟虑的选择。它们在后来的检查中也不会完全相同,这是为什么模糊它们一旦比较和运算符出现就会引起混淆。将 undefined 视为机器的默认值,null 视为你明确的"空",它们的行为就不再感到随意。

Juno无:null 和 undefined 两种方式说"无值"。undefined 是 JavaScript 的默认值,当还没有设置任何东西时。null 是你自己写的,意思是"故意为空"。如果你从未给变量赋值,期望 undefined
Juno无:null 和 undefined 两者都表示缺失,区别在于谁设置的。undefined 自己出现,比如一个没有值声明的变量。null 是你赋值的,用来标记某些东西是故意为空。以这种方式理解它们告诉你一个缺失是意外还是有意的。
Juno无:null 和 undefined 惯例在这里做了繁重的工作:undefined 是 JavaScript 交给你的缺失,null 是你有意赋值的缺失。所以 undefined 通常标记"没有人设置这个",这可能是一个 bug,而 null 读作意图。保持它们分开,后来的比较就不会令你惊讶。

用 typeof 检查类型

当你不确定一个值的类型时,typeof 会告诉你。把它放在一个值前面,它会返回一个命名类型的字符串。

js
console.log(typeof "小王"); // "string"
console.log(typeof 27); // "number"
console.log(typeof true); // "boolean"

注意答案总是文本,一个**字符串**如 "number",不是类型本身。当你想在使用前检查你在处理什么时,这很方便。

typeof 将一个值的类型报告为字符串。将它放在任何值前面,你得回 "string""number""boolean" 等等。

js
const label = "checkout";
console.log(typeof label); // "string"
console.log(typeof 24.99); // "number"
console.log(typeof false); // "boolean"
console.log(typeof undefined); // "undefined"

有一个**怪癖**值得现在知道,因为它第一次会让每个人惊讶:typeof null"object",不是 "null"

js
console.log(typeof null); // "object"

这是语言中一个长期存在的 bug,从未被修复,因为修复它会破坏旧代码。这不是你做错的什么。记住 typeof null 说谎,当你需要时直接检查 null

typeof 获取一个值并返回一个命名其类型的字符串。这是运行时问"我持有什么"的最快方式。

js
console.log(typeof "checkout"); // "string"
console.log(typeof 1499.5); // "number"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"

你必须记住的一个结果是异常:typeof null 返回 "object",不是 "null"

js
console.log(typeof null); // "object"

这是一个**历史怪癖**,一个在 JavaScript 第一版中烘焙的 bug,从未被纠正,因为现在太多现有代码依赖于错误的答案。实际后果是 typeof 单独不能告诉你一个值是 null;你用直接比较代替。这是 JavaScript 向后兼容性权衡的经典例子,其中一个已知的错误保持不变,因为破坏它会破坏网络。

Juno用 typeof 检查类型 在一个值前面放 typeof,它会告诉你类型,作为一个如 "number" 的字符串。当你不确定你持有什么时,这是检查它的最快方式。答案总是文本,所以 typeof 27 给你 "number",引号和所有。
Juno用 typeof 检查类型typeof 返回类型作为字符串,这让你在使用值前检查它。注意一个陷阱:typeof null"object",不是 "null"。这是一个为了兼容性语言保留的 bug,所以直接测试 null 而不是信任 typeof
Juno用 typeof 检查类型typeof 在运行时回答"这是什么类型"作为字符串。要记住的一个结果是错误的:typeof null"object",一个第一版 bug 冻结到位,因为修复它会破坏网络。所以它永远不能为你确认 null;用直接比较代替。

类型的更大图景

你已经认识了日常类型:字符串、数字、布尔值,加上 nullundefined。这足以存储大部分小程序需要的东西。后面的章节添加了将值分组的方式,但这些分组中的每一个仍然是由你已经看到的简单类型构建的。

现在,收获是知道每个值都有一个类型,并且类型决定了你对值能做什么。一个数字你可以加起来;一个字符串你可以连接在一起;一个布尔值你可以检查。记住运算符作为下一步,因为那是你开始组合这些值的地方。

到目前为止的类型,字符串、数字、布尔值、nullundefined,是**原始类型**:简单、单个值。JavaScript 也有非原始类型,那些保存值集合的类型,比如数组和对象。这些在它们自己的章节中介绍,它们以值得学习的方式表现不同,当你到达那里时。

现在要澄清一件事:number 是单一类型。JavaScript 不像某些语言那样将整数和小数分成不同的类型,所以 1010.5 都是相同的 number 类型。这使得数字更简单易于理解,一种类型涵盖每个数值。

这里介绍的类型,字符串、数字、布尔值、nullundefined,是**原始类型:单个、自包含的值。其他所有东西,数组和对象,是引用类型**,它保存一个集合,当你复制或比较它时表现不同。这种差异是许多惊喜的来源,当这些类型出现时它会获得自己的处理。

在类型上时值得标记的几件事。number 是每个数值的一种类型,整数或小数,所以没有分离的整数类型要考虑,在数字中介绍。两个进一步的原始类型存在,你很少早期遇到,bigint 用于对于普通数字太大的整数,symbol 用于唯一的键。类型不是固定到位的:JavaScript 在某些情况下会将一个转换为另一个,一种叫做强制转换的行为(例如,当你连接它们时将数字转换为字符串)。这有实际后果,运算符是它开始重要的地方。

Juno类型的更大图景 每个值都有一个类型,类型决定了你对它能做什么:加数字、连接字符串、检查布尔值。日常类型,字符串、数字、布尔值,加上 nullundefined,涵盖了大部分小程序存储的东西。后面的章节将值分组在一起,但它们都由这些构建。
Juno类型的更大图景 你知道的五种,字符串、数字、布尔值、nullundefined,是原始类型:简单的单个值。数组和对象是非原始类型,后来出现,它们表现不同。便利的事实:number1010.5 都是一种类型,所以没有分离的整数和小数要跟踪。
Juno类型的更大图景 原始类型是单个值;数组和对象是引用类型,复制和比较方式不同,这是惊喜所在。number 覆盖每个数值,bigintsymbol 为罕见情况存在。类型也转换为彼此,叫做强制转换,运算符是它开始重要的地方,所以把它放在你的脑海后部。

类型从这里去哪里

你写的每个值,你读回的每个值,都承载一个类型,并且流利地命名它是接下来所有东西的基础。接下来的章节取你将处理最多的两个,深入讲解:字符串用于处理文本,数字用于计算。之后,运算符是这些类型开始相互遇见、比较、组合,以及有时转换的地方,而知道你持有什么类型是保持它不令你惊讶的原因。