Menu Close

JavaScript 数据类型

JavaScript 中,值总是具有某种类型。例如,一个字符串或一个数字。

JavaScript 数据类型
JavaScript 数据类型

JavaScript 中有八种基本数据类型。这里我们将对它们进行概述,接下来的章节将详细讨论每一种数据类型。

我们可以将任何类型的值存储在变量中。例如,一个变量在某一时刻可以是一个字符串,然后再存储一个数字:

// no error
let message = "hello";
message = 123456;

JavaScript 具有 动态类型弱类型 的特性,这意味着变量的类型是可变的,可以在运行时改变。JavaScript 主要有以下几种数据类型:

JavaScript 具有 动态类型弱类型 的特性,这意味着变量的类型是可变的,可以在运行时改变。JavaScript 主要有以下几种数据类型:

一、基本数据类型(Primitive Types)

基本数据类型是不可变的,存储在栈(Stack)中,直接存储值。主要包括:

1. Number(数字)

JavaScript 只有一种数字类型,即 浮点数,可用于整数和浮点数。数字有许多运算,例如乘法 *、除法 /、加法 +、减法 - 等。

除了常规数字外,还有所谓的“特殊数值”,它们也属于该数据类型:Infinity-InfinityNaN

  • 整数10, -5

  • 小数3.14, -0.5

  • 特殊值

    • Infinity(正无穷大)

    • -Infinity(负无穷大)

    • NaN(Not-a-Number,非数值)

      console.log(typeof 42); // "number"
      console.log(0.1 + 0.2 === 0.3); // false(浮点数精度问题)
      

Infinity 代表数学上的无穷大 。它是一个特殊的值,比任何数字都大。

我们可以通过除以零得到它:

alert( 1 / 0 ); // Infinity

或者直接引用它:

alert( Infinity ); // Infinity

NaN 代表计算错误。它是由不正确或未定义的数学运算产生的结果,例如:

alert( "not a number" / 2 ); // NaN, such division is erroneous

NaN 是“粘性”的。任何对 NaN 进行的进一步数学运算都会返回 NaN

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

因此,如果数学表达式中包含 NaN,它会传播到整个结果(唯一的例外是 NaN ** 0 等于 1)。

数学运算是安全的

JavaScript 中进行数学运算是“安全”的。我们可以执行任何操作:除以零、将非数字字符串当作数字等。

脚本永远不会因致命错误而停止(“崩溃”)。最糟糕的情况是,我们会得到 NaN 作为结果。

特殊数值在形式上属于“number”类型。当然,它们并不是常规意义上的数字。

2. String(字符串)

JavaScript 的字符串是不可变的,可以使用单引号 (')、双引号 (") 或 反引号 (`,模板字符串)。

let str1 = "Hello";
let str2 = 'World';
let str3 = `你好, ${str1}!`; // 模板字符串(支持变量和表达式插值)
console.log(str3); // "你好, Hello!"

双引号和单引号是“简单”引号。在 JavaScript 中,它们几乎没有区别。

反引号是“扩展功能”引号。它们允许我们通过将变量和表达式包裹在 ${…} 中,将它们嵌入字符串,例如:

let name = "John";

// embed a variable
alert( `Hello, ${name}!` ); // Hello, John!

// embed an expression
alert( `the result is ${1 + 2}` ); // the result is 3

${…} 内的表达式会被求值,结果成为字符串的一部分。我们可以将任何内容放入其中:例如像 name 这样的变量,或像 1 + 2 这样的算术表达式,甚至是更复杂的内容。

请注意,这只能在反引号中进行。其他引号没有这种嵌入功能!

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (double quotes do nothing)

JavaScript 中没有字符类型

在某些语言中,有一种特殊的“字符”类型,用于表示单个字符。例如,在 C 语言和 Java 中,它被称为 char

JavaScript 中没有这样的类型。只有一种类型:字符串(string)。一个字符串可以包含零个字符(为空)、一个字符或多个字符。

3. Boolean(布尔值)

布尔值只有 truefalse 两个值,常用于条件判断。

let isTrue = true;
let isFalse = false;
console.log(typeof isTrue); // "boolean"

这种类型通常用于存储 是/否 值:true 表示“是,正确”,false 表示“否,错误”。

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

let isGreater = 4 > 1;

alert( isGreater ); // true (the comparison result is "yes")

4.Undefined(未定义)

undefined 代表变量已声明但未赋值。

从技术上讲,可以显式地将 undefined 赋值给一个变量:

let age = 100;

// change the value to undefined
age = undefined;

alert(age); // "undefined"

……但我们不推荐这样做。通常,null 用于表示变量的“空”值或“未知”值,而 undefined 则作为尚未赋值的默认初始值。

5. Null(空值)

null 表示空对象意外的无值状态,是一个原始类型,特殊值 null 不属于上述任何类型。但 typeof null 误报为 "object"(历史遗留问题)。

它构成了一个独立的类型,该类型仅包含一个值:null

let empty = null;
console.log(typeof empty); // "object"(实际是原始类型)

JavaScript 中,null 不是像某些其他语言中的“对不存在对象的引用”或“空指针”。

let age = null;

它只是一个特殊的值,表示“无内容”、“空”或“未知的值”。

上面的代码表示 age 是未知的。

6. Symbol(符号)

Symbol唯一且不可变的值,可用作对象的属性键,避免命名冲突。symbol 类型用于创建对象的唯一标识符。这里提到它是为了完整性,但详细内容会留到学习对象之后再介绍。

let sym1 = Symbol("desc");
let sym2 = Symbol("desc");
console.log(sym1 === sym2); // false(每个 Symbol 都是唯一的)

二、 引用数据类型(Reference Types)

引用数据类型存储在堆(Heap)中,变量存储的是指向对象的引用,包括:

1、Object(对象)

对象是键值对的集合,属性可以是任意数据类型。object 类型是特殊的。

所有其他类型都被称为“原始类型”,因为它们的值只能表示单一的内容(无论是字符串、数字还是其他类型)。相比之下,对象用于存储数据集合和更复杂的实体。

由于对象在 JavaScript 中至关重要,它们需要特别的关注。在学习完原始类型后,我们会在“对象”章节中深入讨论它们。

let person = {
  name: "Alice",
  age: 25
};
console.log(person.name); // "Alice"

(2)Array(数组)

数组是特殊的对象,索引从 0 开始。

let arr = [1, "hello", true];
console.log(arr[1]); // "hello"

(3)Function(函数)

JavaScript 的函数也是对象,可以赋值给变量或作为参数传递。

function greet() {
  return "Hello!";
}
console.log(greet()); // "Hello!"

(4)Date(日期)

用于表示时间和日期。

let now = new Date();
console.log(now); // 当前日期和时间

(5)RegExp(正则表达式)

正则表达式用于字符串匹配。

let regex = /hello/i;
console.log(regex.test("Hello World")); // true

三、 特殊数据类型

(1)BigInt(大整数)

表示大于 Number.MAX_SAFE_INTEGER 的整数,必须加 n 后缀。

JavaScript 中,number 类型无法安全地表示大于 (2^53 - 1)(即 9007199254740991)或小于 -(2^53 - 1) 的整数。

严格来说,number 类型可以存储更大的整数(最高可达 1.7976931348623157 × 10^308),但超出安全整数范围 ±(2^53 - 1) 后会产生精度误差,因为固定的 64 位存储无法容纳所有数字。因此,可能存储的是一个“近似”值。

例如,以下两个超出安全范围的数字实际上相等:

console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992
let bigNum = 123456789012345678901234567890n;
console.log(typeof bigNum); // "bigint"

也就是说,所有大于 (2^53 - 1) 的奇数在 number 类型中根本无法存储。

对于大多数用途,±(2^53 - 1) 的范围是完全足够的,但有时我们需要表示真正大整数的整个范围,例如用于加密或微秒级精度的时间戳。

BigInt 类型最近被添加到语言中,用于表示任意长度的整数。

一个 BigInt 值通过在整数后面添加 n 来创建:

// the "n" at the end means it's a BigInt
const bigInt = 1234567890123456789012345678901234567890n;

四、typeof 运算符

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

你可能还会遇到另一种语法:typeof(x)。它与 typeof x 是相同的。

需要明确的是:typeof 是一个运算符,而不是一个函数。这里的括号并不是 typeof 的一部分。它们只是用于数学分组的括号。

通常,这种括号包含一个数学表达式,例如 (2 + 2),但在这里,它们只包含一个参数(x)。从语法上讲,它们允许避免在 typeof 运算符和其参数之间留空格,一些人喜欢这种写法。

READ  C语言运算符:按位运算符

尽管 typeof x 语法更常见,但有些人更喜欢使用 typeof(x)

调用 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)

最后三行可能需要额外解释:

  • Math 是一个内置对象,提供数学运算功能。我们将在“数字”章节学习它。这里,它只是一个对象的示例。
  • typeof null 返回 "object",这是 typeof 早期设计中的一个官方错误,并被保留以保持兼容性。实际上,null 不是对象,而是一个具有独立类型的特殊值。这里 typeof 的行为是不正确的。
  • typeof alert 返回 "function",因为 alert 是一个函数。我们将在后续章节学习函数,并了解到 JavaScript 中并没有单独的“函数”类型,函数实际上属于 object 类型。但 typeof 对函数做了特殊处理,返回 "function"。这种行为同样源自 JavaScript 早期的设计,虽然技术上不够严谨,但在实际开发中很方便。

五、总结

JavaScript 中有 8 种基本数据类型。

七种原始数据类型

  1. number:用于表示任何类型的数字,包括整数或浮点数,整数的范围受限于 ±(2^53 - 1)

  2. bigint:用于表示任意长度的整数。

  3. string:用于表示字符串。一个字符串可以包含零个或多个字符,没有单独的字符类型。

  4. boolean:用于表示 truefalse

  5. null:用于表示未知值 – 一个独立的类型,只有一个值 null

  6. undefined:用于表示未赋值的变量 – 一个独立的类型,只有一个值 undefined

  7. symbol:用于表示唯一的标识符。

一种非原始数据类型:

  1. object:用于表示更复杂的数据结构。

typeof 运算符允许我们查看一个变量存储的类型。

  • 通常用法是 typeof x,但 typeof(x) 也可以。

  • 返回一个表示类型名称的字符串,例如 "string"

  • 对于 null 返回 "object" — 这是语言中的一个错误,它实际上并不是一个对象。

在接下来的章节中,我们将重点讨论原始值,等我们熟悉它们后,再继续学习对象。

数据类型 可变性 存储位置 例子
Number 不可变 42, 3.14, NaN
String 不可变 "hello", 'world'
Boolean 不可变 true, false
Undefined 不可变 undefined
Null 不可变 null
Symbol 不可变 Symbol("key")
BigInt 不可变 123n
Object 可变 {}, [], function(){}

这样,你就掌握了 JavaScript 的数据类型!

 

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in JavaScript 基础

Related Posts