JavaScript 数据类型
引言
在编程语言中,数据类型是一个基础且关键的概念。JavaScript作为一门动态类型语言,拥有自己独特的类型系统。理解JavaScript的数据类型不仅能帮助你写出更健壮的代码,还能避免许多常见的错误。
本文将详细介绍JavaScript中的各种数据类型,帮助你打下坚实的基础。
JavaScript 数据类型概览
JavaScript有两大类数据类型:
- 基本数据类型(原始类型):直接存储简单的数据值
- 引用数据类型(对象类型):存储对复杂数据结构的引用
基本数据类型(原始类型)
JavaScript中有7种基本数据类型:
- Number(数字)
- String(字符串)
- Boolean(布尔值)
- Undefined(未定义)
- Null(空值)
- Symbol(符号,ES6新增)
- BigInt(大整数,ES2020新增)
引用数据类型(对象类型)
JavaScript中的对象类型包括:
- Object(对象)
- Array(数组,是特殊的对象)
- Function(函数,是特殊的对象)
- Date(日期对象)
- RegExp(正则 表达式对象)
- Map、Set等(ES6新增)
基本数据类型详解
Number(数字)
JavaScript使用IEEE 754标准的64位浮点数表示所有数字。
// 整数
let int = 42;
// 浮点数
let float = 3.14;
// 科学计数法
let scientific = 5e3; // 5000
// 特殊值
let infinity = Infinity;
let negInfinity = -Infinity;
let notANumber = NaN; // Not a Number
console.log(typeof int); // "number"
JavaScript中没有整数类型,所有数字都是浮点数,这也是为什么0.1 + 0.2 !== 0.3
的原因(浮点数精度问题)。
String(字符串)
字符串是由零个或多个字符组成的文本。在JavaScript中,字符串可以用单引号、双引号或反引号(模板字符串)表示。
let singleQuotes = 'Hello';
let doubleQuotes = "World";
let backticks = `${singleQuotes}, ${doubleQuotes}!`; // 模板字符串支持插值
console.log(backticks); // "Hello, World!"
console.log(typeof backticks); // "string"
常用字符串方法
let text = "JavaScript";
console.log(text.length); // 10
console.log(text.toUpperCase()); // "JAVASCRIPT"
console.log(text.substring(0, 4)); // "Java"
console.log(text.indexOf("Script")); // 4
Boolean(布尔值)
布尔类型只有两个值:true
和false
,用于表示逻辑值。
let isActive = true;
let isLoggedIn = false;
console.log(typeof isActive); // "boolean"
以下值在条件语句中会被视为假(falsy):
false
0
''
(空字符串)null
undefined
NaN
其他所有值,包括所有对象,即使是空对象{}
,都被视为真(truthy)。
Undefined
当变量被声明但没有赋值时,它的值是undefined
。函数如果没有返回值,默认也返回undefined
。
let notAssigned;
console.log(notAssigned); // undefined
function noReturn() {
// 没有return语句
}
console.log(noReturn()); // undefined
console.log(typeof notAssigned); // "undefined"
Null
null
表示一个空值或不存在的对象引用。它是一个特殊的值,表示"没有值"或"空"。
let empty = null;
console.log(empty); // null
// 注意:typeof null的结果是"object",这是JavaScript中的一个历史遗留bug
console.log(typeof empty); // "object"
typeof null
返回"object"
是JavaScript的一个著名bug,但由于历史原因无法修复,因为这会破坏现有代码。
Symbol(ES6新增)
Symbol是ES6引入的新原始数据类型,表示唯一的、不可变的值,主要用作对象属性的键。
let id = Symbol("id");
let id2 = Symbol("id");
console.log(id === id2); // false,每个Symbol值都是唯一的
let user = {
name: "John",
[id]: 123 // 使用Symbol作为对象属性
};
console.log(user[id]); // 123
console.log(typeof id); // "symbol"
BigInt(ES2020新增)
BigInt是一种内置对象,可以表示任意精度的整数。
// 创建BigInt的方法:在整数末尾加n或使用BigInt()构造函数
let bigNumber = 1234567890123456789012345678901234567890n;
let anotherBig = BigInt("9007199254740991");
console.log(bigNumber + 1n); // 1234567890123456789012345678901234567891n
console.log(typeof bigNumber); // "bigint"
引用数据类型详解
Object(对象)
对象是JavaScript中最复杂的数据类型,可以存储各种键值对。
let person = {
firstName: "John",
lastName: "Doe",
age: 30,
isEmployee: true,
sayHello: function() {
return `Hello, my name is ${this.firstName} ${this.lastName}`;
}
};
console.log(person.firstName); // "John"
console.log(person["lastName"]); // "Doe"
console.log(person.sayHello()); // "Hello, my name is John Doe"
console.log(typeof person); // "object"
Array(数组)
数组是一种特殊类型的对象,用于存储有序的数据集合。
let fruits = ["Apple", "Banana", "Orange"];
console.log(fruits[0]); // "Apple"
console.log(fruits.length); // 3
// 添加元素
fruits.push("Mango");
console.log(fruits); // ["Apple", "Banana", "Orange", "Mango"]
// 数组方法
console.log(fruits.join(", ")); // "Apple, Banana, Orange, Mango"
let citrus = fruits.slice(1, 3);
console.log(citrus); // ["Banana", "Orange"]
console.log(typeof fruits); // "object"
console.log(Array.isArray(fruits)); // true
Function(函数)
函数在JavaScript中是一种特殊的对象,可以被调用执行。
// 函数声明
function add(a, b) {
return a + b;
}
// 函数表达式
const multiply = function(a, b) {
return a * b;
};
// 箭头函数(ES6)
const subtract = (a, b) => a - b;
console.log(add(5, 3)); // 8
console.log(multiply(5, 3)); // 15
console.log(subtract(5, 3)); // 2
console.log(typeof add); // "function"
类型检测
在JavaScript中,可以使 用多种方式检测数据类型:
typeof运算符
console.log(typeof 42); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (这是一个bug)
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
instanceof运算符
instanceof
运算符用于检测对象是否属于某个构造函数的实例。
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true (因为数组也是对象)
let date = new Date();
console.log(date instanceof Date); // true