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

四、结语

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

相关推荐
天平12 分钟前
油猴脚本创建webworker踩坑记录
前端·javascript·typescript
山河木马6 小时前
渲染管线-计算得到gl_Position(顶点着色器)之后续GPU流程
javascript·webgl·图形学
竹林8187 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
kyriewen10 小时前
别再每次都 Google 了:我整理了前端日常最常踩的 10 个 Git 坑,附速查表
前端·javascript·git
SmartBoyW11 小时前
深入ECMAScript规范:彻底搞懂JS隐式类型转换与底层ToPrimitive机制
前端·javascript
用户8524950718411 小时前
解密 JavaScript 中的 this:谁才是真正的调用者?
javascript·面试
Heo11 小时前
Vite进阶用法详解
前端·javascript·面试
铁皮饭盒12 小时前
Next.js 风格路由内置?Bun FileSystemRouter 凭啥这么香
javascript
小林ixn13 小时前
别再背八股了!从 5 个真实场景彻底搞懂 JavaScript 的 this
javascript
东风破_14 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript