值与类型

本章将详细介绍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数据时。