1. 基本数据类型
基本数据类型包括:string
、null
、undefined
、number
、symbol
、boolean
。这些类型的值具有以下特性:
- 按值访问:基本数据类型直接存储值,因此通过变量访问时操作的是其实际值。
- 不可变性:基本数据类型的值是不可变的,任何对它们的操作都会返回一个新值,而不会修改原值。
- 值比较:基本数据类型在比较时直接比较它们的值。
- 存储在栈内存中:栈内存(
Stack
)用于存储基本数据类型的值,栈是一种后进先出(LIFO)的数据结构,操作非常高效。
图示:
示例代码:
let a = 10;
let b = a; // b 得到的是 a 的值的副本
a = 20;
console.log(b); // 10,不受 a 变化的影响
2. 引用数据类型
引用数据类型包括对象、数组、日期、正则表达式和函数等。它们的特性如下:
- 按引用访问:引用数据类型通过引用来访问,意味着多个变量可以引用同一个对象,操作该对象时会影响所有引用它的变量。
- 可变性:引用类型的值是可变的,对对象、数组等的修改会直接影响原引用。
- 引用比较:在比较引用类型时,比较的是引用(即内存地址),而不是它们的内容。
- 存储在堆内存中:堆内存(
Heap
)用于存储引用类型的对象。栈内存中只保存对象的引用地址,实际数据存储在堆内存中。
图示:
示例代码:
let obj1 = {
name: "Alice" };
let obj2 = obj1; // obj2 引用的是同一个对象
obj1.name = "Bob";
console.log(obj2.name); // Bob,obj1 和 obj2 都指向同一对象
3. 数据类型的检测
JavaScript 提供了两种常用的方式来检测变量的类型:typeof
和 instanceof
。
3.1 typeof
操作符
typeof
用于检测基本数据类型和函数的类型,但对于引用数据类型的结果不够准确。它的输出主要有以下几种情况:
typeof "hello"
返回"string"
typeof 123
返回"number"
typeof true
返回"boolean"
typeof undefined
返回"undefined"
typeof function() {}
返回"function"
typeof null
返回"object"
(这是一个历史遗留问题)typeof []
返回"object"
typeof {}
返回"object"
示例代码:
console.log(typeof "hello"); // "string"
console.log(typeof []); // "object"
3.2 instanceof
操作符
instanceof
用于检测引用数据类型,可以判断某个对象是否是某个构造函数的实例。它通过检测对象的原型链,判断构造函数的 prototype
是否出现在对象的原型链上。
[] instanceof Array
返回true
{}
instanceof Object 返回true
function() {} instanceof Function
返回true
示例代码:
console.log([] instanceof Array); // true
console.log({
} instanceof Object); // true
console.log(function() {
} instanceof Function); // true
结语
理解 JavaScript 中的基本数据类型和引用数据类型及其区别,能够帮助开发者写出更高效的代码。通过 typeof
和 instanceof
操作符,开发者可以准确判断变量的类型,掌握 JavaScript 的内存模型和类型检测机制,有助于优化程序性能并避免常见的类型错误。