JavaScript 数据类型
JavaScript 数据类型详解
Section titled “JavaScript 数据类型详解”理解数据类型在包括 JavaScript 在内的任何编程语言中都至关重要。JavaScript 是一种动态类型语言,这意味着在使用变量之前,你无需声明其类型。
JavaScript 原始数据类型
Section titled “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 具有动态类型
Section titled “JavaScript 具有动态类型”JavaScript 是动态类型的。这意味着一个变量在不同时间可以持有不同类型的值:
let x; // x 是 undefinedx = 5; // 现在 x 是 Numberx = "John"; // 现在 x 是 Stringx = { type: "Car" }; // 现在 x 是 ObjectJavaScript 字符串
Section titled “JavaScript 字符串”字符串是字符序列。字符串可以使用单引号 ('...')、双引号 ("...") 或反引号(模板字面量:...)创建。
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 isa multi-linestring.`; // 这是一个多行字符串。字符串有许多用于操作的内置方法(例如,length、toUpperCase()、slice())。
JavaScript 数字
Section titled “JavaScript 数字”JavaScript 使用一个单一的 Number 类型来表示整数和浮点数,它基于 IEEE 754 标准。这意味着浮点运算可能存在精度问题。
const pi = 3.14; // 带小数const count = 100; // 不带小数
// 指数表示法:const largeNum = 1.23e6; // 1.23 * 10^6 = 1230000const smallNum = 1.23e-4; // 1.23 * 10^-4 = 0.000123
// 特殊数值:console.log(1 / 0); // Infinityconsole.log("text" / 2); // NaN (非数值)对于超出安全整数范围(±(253-1))的数字,请使用 BigInt。
JavaScript 布尔值
Section titled “JavaScript 布尔值”布尔值表示真假值,只能是 true 或 false。
const isDataValid = true;const isLoggedIn = false;
if (isLoggedIn) { console.log("User is logged in."); // 用户已登录。} else { console.log("User is not logged in."); // 用户未登录。}布尔值是条件逻辑和控制流的基础。
JavaScript 数组
Section titled “JavaScript 数组”数组是有序的值集合。它们使用方括号 [] 创建。
const cars = ["Saab", "Volvo", "BMW"];const mixedArray = [1, "apple", true, { city: "New York" }];数组元素通过它们的索引(基于 0)访问:cars[0] 是 “Saab”。数组有许多强大的内置方法(例如,push()、pop()、map()、filter()、reduce())。
JavaScript 对象
Section titled “JavaScript 对象”对象是无序的键值对集合(属性)。它们使用花括号 {} 创建。
const person = { firstName: "John", lastName: "Doe", age: 50, eyeColor: "blue", address: { street: "123 Main St", city: "Anytown" }};属性可以使用点表示法(person.firstName)或方括号表示法(person["lastName"])访问。对象非常灵活,并构成了复杂数据结构的基础。
typeof 运算符
Section titled “typeof 运算符”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
Section titled “Undefined”undefined 是一个原始值,它会自动分配给刚声明但尚未赋值的变量、未提供实际参数的函数参数,或缺失的对象属性。
let personName; // 值为 undefined,typeof personName 是 "undefined"
function greet(name) { console.log(name); // 如果调用 greet(),name 将是 undefined}
const obj = {};console.log(obj.missingProperty); // undefinednull 是一个原始值,表示有意缺少任何对象值。它必须被明确地赋值。
let user = null; // 值为 null,typeof user 是 "object"(怪异之处)
// 要明确清除对象引用:let myObject = { data: "some data" };myObject = null; // 该对象现在符合垃圾回收条件Undefined 与 Null 的区别
Section titled “Undefined 与 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 时由于类型强制转换引起的混淆。