值与类型
本章将详细介绍ECMAScript中的数据类型系统,包括基本数据类型和复杂数据类型,以及如何检测和使用这些类型。
3.1 数据类型概述
ECMAScript是一种动态类型语言,这意味着变量的类型在运行时确定,而不是在编译时确定。ECMAScript的数据类型分为两大类:
- 基本数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol、BigInt
- 复杂数据类型(引用类型):Object
3.2 基本数据类型
Undefined类型
Undefined类型只有一个值,即undefined。当声明一个变量但未初始化时,该变量的值就是undefined:
let message;
console.log(message); // undefined
console.log(typeof message); // "undefined"
Null类型
Null类型也只有一个值,即null。null值表示一个空对象指针:
let car = null;
console.log(typeof car); // "object" (这是JavaScript的一个历史bug)
Boolean类型
Boolean类型只有两个值:true和false:
let isComplete = true;
let isPending = false;
// 转换为布尔值
console.log(Boolean("Hello")); // true
console.log(Boolean(0)); // false
Number类型
Number类型用于表示整数和浮点数:
let intNum = 42;
let floatNum = 3.14159;
let hexNum = 0xFF; // 十六进制
let expNum = 1.25e3; // 科学计数法
// 特殊数值
let infinity = Infinity;
let negativeInfinity = -Infinity;
let notANumber = NaN;
String类型
String类型用于表示文本数据:
let firstName = "张";
let lastName = '三';
let greeting = `你好, ${firstName}${lastName}!`; // 模板字符串
// 字符串方法
console.log(greeting.length); // 5
console.log(greeting.toUpperCase()); // "你好, 张三!"
Symbol类型
Symbol是ES6引入的一种基本数据类型,表示独一无二的值:
let sym1 = Symbol();
let sym2 = Symbol("description");
let sym3 = Symbol("description");
console.log(sym2 === sym3); // false,每个Symbol都是唯一的
BigInt类型
BigInt是ES2020引入的一种基本数据类型,用于表示任意精度的整数:
let bigNumber = 123456789012345678901234567890n;
let anotherBigNumber = BigInt("123456789012345678901234567890");
3.3 复杂数据类型
Object类型是ECMAScript中所有对象的基础类型,包括普通对象、数组、函数等:
普通对象
let person = {
name: "张三",
age: 25,
greet: function() {
return `你好, 我是${this.name}`;
}
};
数组
let fruits = ["苹果", "香蕉", "橙子"];
let numbers = [1, 2, 3, 4, 5];
console.log(fruits.length); // 3
console.log(fruits[0]); // "苹果"
函数
function add(a, b) {
return a + b;
}
let multiply = function(a, b) {
return a * b;
};
let divide = (a, b) => a / b; // 箭头函数
3.4 类型检测
在ECMAScript中有多种方式可以检测变量的类型:
typeof操作符
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (历史bug)
console.log(typeof true); // "boolean"
console.log(typeof 42); // "number"
console.log(typeof "Hello"); // "string"
console.log(typeof Symbol()); // "symbol"
console.log(typeof BigInt(42)); // "bigint"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
instanceof操作符
let arr = [1, 2, 3];
let obj = { name: "张三" };
let func = function() {};
console.log(arr instanceof Array); // true
console.log(obj instanceof Object); // true
console.log(func instanceof Function); // true
Object.prototype.toString方法
let toString = Object.prototype.toString;
console.log(toString.call([])); // "[object Array]"
console.log(toString.call({})); // "[object Object]"
console.log(toString.call(null)); // "[object Null]"
console.log(toString.call(undefined)); // "[object Undefined]"
3.5 类型转换
ECMAScript中的类型转换分为显式转换和隐式转换:
显式转换
// 转换为字符串
let num = 42;
let str = String(num); // "42"
// 转换为数字
let strNum = "123";
let num2 = Number(strNum); // 123
// 转换为布尔值
let value = "Hello";
let bool = Boolean(value); // true
隐式转换
// 字符串拼接时的转换
let result = "年龄: " + 25; // "年龄: 25"
// 数值运算时的转换
let sum = "5" - 3; // 2 (字符串"5"被转换为数字)
let product = "5" * 3; // 15
提示:理解数据类型对于编写可靠的JavaScript代码至关重要,特别是在处理用户输入和API数据时。