Skip to content

JavaScript 数据类型

理解数据类型在包括 JavaScript 在内的任何编程语言中都至关重要。JavaScript 是一种动态类型语言,这意味着在使用变量之前,你无需声明其类型。

JavaScript 有七种原始数据类型:

  • String(字符串):表示文本数据(例如,“Hello World”)。
  • Number(数字):表示数值,包括整数和浮点数(例如,42,3.14)。特殊的数值包括 Infinity、-Infinity 和 NaN(Not a Number,非数值)。
  • Boolean(布尔值):表示逻辑实体,只有两个值:true 或 false。
  • Null(空):表示有意缺少任何对象值。它是一个原始值,但 typeof null 矛盾地返回 “object”(这是一个长期存在的怪异之处)。
  • Undefined(未定义):表示一个已声明但尚未赋值的变量,或者一个未提供的函数参数。
  • Symbol(符号,ES6):表示一个独一无二且不可变的标识符。常被用作对象属性的键,以避免命名冲突。
  • BigInt(大整数,ES2020):表示大于 253 - 1 的整数,这是 JavaScript 的 Number 类型可以可靠表示的最大整数。

以及一种非原始(引用)类型:

  • Object(对象):表示键值对的集合。数组 (Arrays)、函数 (Functions)、日期 (Dates)、正则表达式 (RegExp) 等都是特殊类型的对象。

变量声明示例:

let age = 30; // 数字
const name = "Alice"; // 字符串
const isActive = true; // 布尔值
const userSettings = { theme: "dark" }; // 对象
const scores = [90, 85, 92]; // 数组(一种对象)
let notAssigned; // 未定义
let noValue = null; // 空值
const id = Symbol('uniqueId'); // 符号
const veryLargeNumber = 9007199254740991n; // 大整数

数据类型的概念与类型强制转换

Section titled “数据类型的概念与类型强制转换”

了解变量的数据类型很重要,因为操作会根据类型表现出不同的行为。

考虑一下:

let result = 16 + "Volvo"; // 这里会发生什么?

JavaScript 会执行类型强制转换(type coercion)。如果一个操作数是字符串,JavaScript 会尝试将另一个操作数转换为字符串并将它们连接起来。因此,result 变为 "16Volvo"。

JavaScript 从左到右评估表达式。不同的顺序由于强制转换可能会产生不同的结果:

let x = 16 + 4 + "Volvo"; // 结果: "20Volvo" (16+4 等于 20,然后 20 + "Volvo")
let y = "Volvo" + 16 + 4; // 结果: "Volvo164" ("Volvo"+16 等于 "Volvo16",然后 "Volvo16"+4)

为了避免意外的行为,通常最好明确类型,或使用不执行类型强制转换的严格相等运算符(===、!==)。你可以在比较章节中了解更多信息。

JavaScript 是动态类型的。这意味着一个变量在不同时间可以持有不同类型的值:

let x; // x 是 undefined
x = 5; // 现在 x 是 Number
x = "John"; // 现在 x 是 String
x = { type: "Car" }; // 现在 x 是 Object

字符串是字符序列。字符串可以使用单引号 ('...')、双引号 ("...") 或反引号(模板字面量:...)创建。

const carName1 = "Volvo XC60";
const carName2 = 'Volvo XC60';
// 在字符串中使用引号:
const answer1 = "It's alright";
const answer2 = 'He is called "Johnny"';
// 模板字面量 (ES6+) 用于嵌入表达式和多行字符串:
const userName = "Bob";
const greeting = `Hello, ${userName}!`; // "Hello, Bob!"
const multiLine = `This is
a multi-line
string.`; // 这是一个
多行
字符串。

字符串有许多用于操作的内置方法(例如,length、toUpperCase()、slice())。

JavaScript 使用一个单一的 Number 类型来表示整数和浮点数,它基于 IEEE 754 标准。这意味着浮点运算可能存在精度问题。

const pi = 3.14; // 带小数
const count = 100; // 不带小数
// 指数表示法:
const largeNum = 1.23e6; // 1.23 * 10^6 = 1230000
const smallNum = 1.23e-4; // 1.23 * 10^-4 = 0.000123
// 特殊数值:
console.log(1 / 0); // Infinity
console.log("text" / 2); // NaN (非数值)

对于超出安全整数范围(±(253-1))的数字,请使用 BigInt。

布尔值表示真假值,只能是 true 或 false。

const isDataValid = true;
const isLoggedIn = false;
if (isLoggedIn) {
console.log("User is logged in."); // 用户已登录。
} else {
console.log("User is not logged in."); // 用户未登录。
}

布尔值是条件逻辑和控制流的基础。

数组是有序的值集合。它们使用方括号 [] 创建。

const cars = ["Saab", "Volvo", "BMW"];
const mixedArray = [1, "apple", true, { city: "New York" }];

数组元素通过它们的索引(基于 0)访问:cars[0] 是 “Saab”。数组有许多强大的内置方法(例如,push()、pop()、map()、filter()、reduce())。

对象是无序的键值对集合(属性)。它们使用花括号 {} 创建。

const person = {
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue",
address: {
street: "123 Main St",
city: "Anytown"
}
};

属性可以使用点表示法(person.firstName)或方括号表示法(person["lastName"])访问。对象非常灵活,并构成了复杂数据结构的基础。

typeof 运算符返回一个字符串,指示其操作数的类型。

typeof "John" // 返回 "string"
typeof 3.14 // 返回 "number"
typeof NaN // 返回 "number" (NaN 是一个特殊的数字)
typeof false // 返回 "boolean"
typeof [1, 2, 3, 4] // 返回 "object" (数组是对象)
typeof { name: 'John', age: 34 } // 返回 "object"
typeof new Date() // 返回 "object"
typeof function() {} // 返回 "function" (函数是特殊对象)
typeof myVariable // 返回 "undefined" (如果 myVariable 未声明或未赋值)
typeof null // 返回 "object" (这是一个历史遗留的 bug)
typeof Symbol('id') // 返回 "symbol"
typeof 9007199254740991n // 返回 "bigint"
注意:typeof null 返回 “object” 是 JavaScript 中一个长期存在的怪异之处。要正确检查 null,请使用严格相等:myVar === null。

undefined 是一个原始值,它会自动分配给刚声明但尚未赋值的变量、未提供实际参数的函数参数,或缺失的对象属性。

let personName; // 值为 undefined,typeof personName 是 "undefined"
function greet(name) {
console.log(name); // 如果调用 greet(),name 将是 undefined
}
const obj = {};
console.log(obj.missingProperty); // undefined

null 是一个原始值,表示有意缺少任何对象值。它必须被明确地赋值。

let user = null; // 值为 null,typeof user 是 "object"(怪异之处)
// 要明确清除对象引用:
let myObject = { data: "some data" };
myObject = null; // 该对象现在符合垃圾回收条件

undefined 通常意味着变量尚未初始化或缺少值。null 用于明确指示变量不应有值,或者对象引用不指向任何东西。

console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object"
console.log(null === undefined); // false(严格相等)
console.log(null == undefined); // true(宽松相等,由于类型强制转换——通常应避免)

通常建议使用严格相等(=== 和 !==)来避免在比较 null 和 undefined 时由于类型强制转换引起的混淆。