JavaScript 数据类型
JavaScript 是一种动态类型语言,这意味着变量的类型在运行时可以改变。JavaScript 提供了多种数据类型,可分为 基本类型(也称为原始类型)和 引用类型(也称为对象类型)。
JavaScript 的数据类型概览
JavaScript 的数据类型可以分为两大类:
1. 基本数据类型(Primitive Types):
String
(字符串)Number
(数字)BigInt
(大整数)Boolean
(布尔值)Undefined
(未定义)Null
(空值)Symbol
(符号)
2. 引用数据类型(Reference Types):
- Object(对象,包括数组、函数、日期等)
这些数据类型可以通过 typeof 操作符进行检测(除 null)。
基本数据类型
1. String
类型
字符串表示一组字符的序列,用于表示文本数据。
let str1 = "双引号字符串";
let str2 = '单引号字符串';
let str3 = `模板字符串`;
- 使用单引号 '、双引号 " 或模板字符串(反引号 ``)表示。
- 模板字符串支持内嵌变量和表达式,语法为 ${变量}。
let name = "Simin";
let age = 25;
// 普通字符串
let greeting = "Hello, " + name + "!";
// 模板字符串
let greetingTemplate = `Hello, ${name}! You are ${age} years old.`;
console.log(greeting); // 输出:Hello, John!
console.log(greetingTemplate); // 输出:Hello, John! You are 25 years old.
常用方法:
str.length
: 获取字符串长度。str.toUpperCase()
: 转为大写。str.toLowerCase()
: 转为小写。str.includes(substring)
: 判断是否包含子字符串。str.slice(start, end)
: 提取部分字符串。
let text = "JavaScript";
console.log(text.length); // 输出:10
console.log(text.toUpperCase()); // 输出:JAVASCRIPT
console.log(text.includes("Script")); // 输出:true
console.log(text.slice(0, 4)); // 输出:Java
2. Number 类型
数字类型用于表示整数和浮点数。
- JavaScript 中的数字使用 64 位浮点格式存储(IEEE 754 标准)。
NaN
表示“不是数字”(Not a Number)。Infinity
和-Infinity
表示无穷大。
let num1 = 42; // 整数
let num2 = 3.14; // 浮点数
let num3 = Infinity; // 正无穷
let num4 = NaN; // 非数字
console.log(num1 + num2); // 输出:45.14
console.log(0 / 0); // 输出:NaN
console.log(1 / 0); // 输出:Infinity
常用方法:
Math.round()
: 四舍五入。Math.floor()
: 向下取整。Math.ceil()
: 向上取整。Math.random()
: 生成随机数(0 到 1)。
console.log(Math.round(4.6)); // 输出:5
console.log(Math.floor(4.9)); // 输出:4
console.log(Math.ceil(4.1)); // 输出:5
console.log(Math.random()); // 输出:随机数
3. BigInt 类型
大整数类型用于表示任意精度的整数。 通过在数字后添加 n 表示 BigInt,或使用 BigInt() 函数创建。
let bigInt1 = 1234567890123456789012345678901234567890n;
let bigInt2 = BigInt("1234567890123456789012345678901234567890");
console.log(bigInt1 + 10n); // 输出:1234567890123456789012345678901234567800n
注意
BigInt 和普通数字 Number 不能直接混合运算。
4. Boolean 类型
布尔值只有两个值:true
和 false
。
用途:
- 用于逻辑控制流(如条件判断)。
- 表示真假或开关状态。
let isAvailable = true;
let isComplete = false;
if (isAvailable) {
console.log("资源可用");
} else {
console.log("资源不可用");
}
5. Undefined 类型
未定义表示一个变量已经声明但未初始化
let x;
console.log(x); // 输出:undefined
6. Null 类型
空值表示一个变量被显式赋值为“没有值”。
let y = null;
console.log(y); // 输出:null
注意
typeof null
的值是 "object"
,这是一个已知的历史遗留问题。
7. Symbol 类型
符号是唯一且不可变的标识符,通常用于对象的属性名。
创建方式:
let sym1 = Symbol();
let sym2 = Symbol("描述");
let uniqueKey = Symbol("key");
let obj = {
[uniqueKey]: "value"
};
console.log(obj[uniqueKey]); // 输出:value
引用数据类型
引用数据类型存储的是对象的引用地址,而不是实际值。对引用数据类型的操作会直接影响存储在内存中的数据。
引用数据类型的特点
- 动态大小:引用类型可以动态扩展大小,适合存储大量复杂的数据。
- 共享引用:多个变量可以引用同一个对象,对其修改会影响所有引用它的变量。
- 存储位置:引用类型的数据存储在堆内存中,变量保存的是堆内存的地址。
1. Object 类型
对象 是 JavaScript 的核心类型,用于表示键值对集合。所有引用类型(如数组、函数)都继承自 Object
。
创建对象的方式
- 使用对象字面量:
const obj = { key: "value" };
- 使用
Object
构造函数:
const obj = new Object();
obj.key = "value";
常用方法
Object.keys()
:获取对象的所有键。
const person = { name: "Simin", age: 24 };
console.log(Object.keys(person)); // 输出:["name", "age"]
Object.values()
:获取对象的所有值。
console.log(Object.values(person)); // 输出:["Simin", 24]
Object.entries()
:获取键值对数组。
console.log(Object.entries(person)); // 输出:[["name", "Simin"], ["age", 24]]
Object.assign()
:合并对象。
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const merged = Object.assign({}, obj1, obj2);
console.log(merged); // 输出:{ a: 1, b: 2 }
Object.freeze()
和Object.seal()
:
- freeze:冻结对象,禁止修改。
- seal:允许修改现有属性,但禁止添加新属性。
const frozen = Object.freeze({ a: 1 });
frozen.a = 2; // 无效操作
2. Array 类型
数组是对象的特殊形式,用于存储有序的数据集合。
创建方式
const arr = [1, 2, 3];
const arr2 = new Array(1, 2, 3);
常用方法
push()
和pop()
:添加或移除末尾元素。
const nums = [1, 2, 3];
nums.push(4); // 添加 4,数组变为 [1, 2, 3, 4]
nums.pop(); // 移除末尾元素,数组变为 [1, 2, 3]
shift()
和unshift()
:添加或移除开头元素。
nums.unshift(0); // 添加 0,数组变为 [0, 1, 2, 3]
nums.shift(); // 移除开头元素,数组变为 [1, 2, 3]
map()
:返回新数组,应用回调函数到每个元素。
const doubled = nums.map(x => x * 2);
console.log(doubled); // 输出:[2, 4, 6]
filter()
:返回新数组,包含符合条件的元素。
const even = nums.filter(x => x % 2 === 0);
console.log(even); // 输出:[2]
reduce()
:对数组中的元素累计运算。
const sum = nums.reduce((acc, val) => acc + val, 0);
console.log(sum); // 输出:6
3. Function 类型
函数是 JavaScript 的一等公民。它既可以作为值传递,又可以动态创建。
创建方式
- 函数声明:
function add(a, b) {
return a + b;
}
- 函数表达式:
const multiply = function(a, b) {
return a * b;
};
- 箭头函数:
const subtract = (a, b) => a - b;
函数特性
- 可以嵌套函数。
- 支持闭包(Closure)。
- 支持默认参数:
function greet(name = "Simin") {
console.log(`Hello, ${name}`);
}
greet(); // 输出:Hello, Simin
4. Date 类型
Date
对象用于处理时间和日期。Date
虽然是个对象,但是他又不完全是Object类型,Date
类型实际上是 Object
的子类型。在 JavaScript 中,Date
对象是基于 Object
构造的,因此它继承了 Object
的一些基本特性,比如可以使用 Object
的方法。
Date
类型是 JavaScript 中专门用于处理日期和时间的对象类型,它继承了 Object
的一些基本特性,但具有自己独特的属性和方法,用于表示和操作日期时间。而一般对象则是 JavaScript 中用于存储和组织数据的基本数据结构,具有高度的灵活性和可扩展性,可以表示各种复杂的数据和逻辑。两者在用途、内部结构和操作方法上都有明显的区别,但在本质上都是对象,可以相互配合使用,满足不同的编程需求。
无论是 Date
对象还是一般对象,它们都是属性的集合。Date
对象有一组预定义的属性和方法,用于处理日期和时间,而一般对象的属性和方法可以根据需要自定义。
- 用途和设计目的:
Date 对象:专门用于表示日期和时间。它提供了一系列的方法来获取、设置和操作日期和时间,如 getFullYear()
、setHours()
、getTime()
等。Date
对象内部存储的是一个时间戳(自 1970 年 1 月 1 日以来的毫秒数),并提供了多种方法来格式化和计算日期时间。 一般对象:用于存储和组织数据,可以表示各种复杂的数据结构。对象的属性和方法可以根据具体的应用场景来定义,非常灵活。对象通常用于封装数据和行为,实现各种功能和逻辑。
- 内部结构和数据存储:
Date 对象:内部存储的是一个时间戳(一个长整型数值),表示从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间经过的毫秒数。Date 对象的方法都是基于这个时间戳进行计算和操作的。 一般对象:内部存储的是属性和方法的集合。属性可以是各种类型的数据,如字符串、数字、布尔值、数组、函数等。对象的数据结构可以根据需要进行嵌套和组合,形成复杂的数据模型。
const now = new Date(); // 当前时间
const specificDate = new Date("2023-01-01"); // 指定时间
常用方法
- 获取时间部分:
console.log(now.getFullYear()); // 获取年份
console.log(now.getMonth()); // 获取月份(从 0 开始)
console.log(now.getDate()); // 获取日期
- 设置时间部分:
now.setFullYear(2025);
console.log(now); // 输出:修改后的日期