JavaScript 简单类型与复杂类型

在JavaScript中,数据类型的区分对于理解变量如何存储以及它们的行为至关重要。JavaScript中的数据类型大致可以分为两类:简单类型(Primitive Types)和复杂类型(Reference Types)。了解这两类数据类型的区别有助于我们更好地编写高效、可靠的代码。本文将详细介绍JavaScript中的简单类型和复杂类型,并探讨它们之间的差异及其应用场景。

一、简单类型(Primitive Types)

简单类型是JavaScript中最基础的数据类型,它们直接包含值,并且这些值是不可变的(immutable),即一旦创建就不能更改。JavaScript中的简单类型包括以下几种:

(一)数字(Number)

用于表示整数或浮点数。

javascript 复制代码
let age = 25; // 整数
let price = 99.99; // 浮点数

(二)字符串(String)

用于表示文本数据,由一系列字符组成。

javascript 复制代码
let greeting = "Hello, world!";

(三)布尔值(Boolean)

仅有两个可能的值:truefalse,用于逻辑判断。

javascript 复制代码
let isActive = true;
let isDisabled = false;

(四)空值(Null)

表示一个有意设置为空的值,通常用来表示"没有值"。

javascript 复制代码
let emptyValue = null;

(五)未定义(Undefined)

当声明了一个变量但未赋值时,默认其值为undefined

javascript 复制代码
let unsetVariable;
console.log(unsetVariable); // 输出: undefined

(六)符号(Symbol)[ES6新增]

一种新的原始数据类型,通常用于创建对象属性的唯一标识符。

javascript 复制代码
let uniqueKey = Symbol('description');

二、复杂类型(Reference Types)

与简单类型不同,复杂类型指的是那些引用类型的值,如对象、数组和函数等。这些类型的值实际上是对内存中某个位置的引用,而非直接存储实际值。

(一)对象(Object)

对象是一组属性的集合,每个属性都有一个键和对应的值。

javascript 复制代码
let person = {
    name: "Alice",
    age: 30,
    city: "Beijing"
};

(二)数组(Array)

一种特殊的对象,用于有序地存储多个值。

javascript 复制代码
let colors = ["red", "green", "blue"];

(三)函数(Function)

函数也是一种对象,它可以被调用执行特定任务。

javascript 复制代码
function greet() {
    console.log("Hello!");
}

三、简单类型 vs 复杂类型

(一)存储方式

  • 简单类型:直接存储在栈(stack)内存中,存储的是具体的值。
  • 复杂类型:仅在栈内存中保存对堆(heap)内存中实际对象的引用地址。

(二)复制行为

  • 简单类型:复制时会创建一个新的副本,修改其中一个不会影响另一个。

    javascript 复制代码
    let a = 10;
    let b = a;
    b = 20;
    console.log(a); // 输出: 10
  • 复杂类型:复制时只是传递了引用地址,因此两个变量指向同一个对象,修改会影响到彼此。

    javascript 复制代码
    let objA = { value: 10 };
    let objB = objA;
    objB.value = 20;
    console.log(objA.value); // 输出: 20

(三)比较操作

  • 简单类型:基于值进行比较。

    javascript 复制代码
    console.log(1 === 1); // 输出: true
  • 复杂类型 :基于引用地址进行比较,即使内容相同,如果引用地址不同,则结果为false

    javascript 复制代码
    let objA = { value: 10 };
    let objB = { value: 10 };
    console.log(objA === objB); // 输出: false

四、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
掘金安东尼2 分钟前
🧭 本周 Web 前端精选|2025年第14周
前端·javascript·面试
陳長生.17 分钟前
JAVA EE_多线程-初阶(二)
java·开发语言·jvm·java-ee
晓得迷路了26 分钟前
栗子前端技术周刊第 75 期 - Rspack 1.3、React 19.1、Astro 5.6...
前端·javascript·react.js
QTX1873028 分钟前
常见的 JavaScript 框架和库
开发语言·javascript·ecmascript
爽帅_39 分钟前
【C++】STL库_stack_queue 的模拟实现
开发语言·c++
好_快42 分钟前
Lodash源码阅读-baseIsMatch
前端·javascript·源码阅读
maizeman1261 小时前
R语言——获取数据1
开发语言·r语言·数据读取·内置数据集
。。。9041 小时前
C++中,应尽可能将引用形参声明为const
开发语言·c++
云边有个稻草人1 小时前
【C++】第九节—string类(中)——详解+代码示例
开发语言·c++·迭代器·string类·string的常用接口·string的模拟实现·string的经典例题
煤烦恼1 小时前
scala类与集合
java·大数据·开发语言·人工智能·scala