JavaScript 数据类型与内存分配机制探究

数据类型

一、JavaScript 数据类型

原始类型(基本类型)

  1. string:文本数据
  2. number:整数/浮点数
  3. boolean :逻辑值(true/false
  4. null :空值(typeof null === 'object' 是历史遗留问题)
  5. undefined:未定义值(声明未赋值的变量)
  6. symbol :唯一不可变值(Symbol('id')
  7. bigint :大整数(9007199254740991n,解决 Number.MAX_SAFE_INTEGER 限制)

引用类型(复杂类型)

  1. Object :键值对集合({ name: 'John' }
  2. Array :有序列表([1, 2, 3]
  3. Function :可执行对象(function() {}
  4. Date :日期时间(new Date()
  5. 其他内置对象:如 Map, Set, RegExp

关键区别:原始类型直接存储值,引用类型存储内存地址。

二、JavaScript 的语言类型特性

1. 动态语言 vs 静态语言
ini 复制代码
// 动态类型:运行时确定类型
let x = 10;    // 此时 x 是 number
x = "hello";   // 运行时变为 string
  • 静态语言 (如 Java/C++):需预先声明变量类型(编译时检查)
  • 动态语言 (JS/Python):类型在运行时确定,灵活性高但需注意类型错误
2. 弱类型 vs 强类型
arduino 复制代码
// 弱类型:允许隐式类型转换
console.log(8 + "2"); // "82"(number→string自动转换)
console.log("5" - 3); // 2(string→number自动转换)
  • 强类型 (如 Python/Java):禁止隐式类型转换("5"+2 报错)
  • 弱类型 (JS/PHP):支持自动类型转换,需警惕意外结果

三、JavaScript 存储空间

V8 引擎将内存分为三个核心区域:

内存区域 存储内容 访问方式 生命周期
代码空间 可执行二进制代码 直接执行 持久化
栈空间 原始类型值、引用地址 快速顺序访问 随函数调用结束
堆空间 引用类型数据(对象、数组等) 通过指针间接访问 由 GC 管理
这里函数比较特殊
元素 存储位置 说明
函数定义 堆空间 包含可执行代码、闭包数据等
函数名/引用变量 栈空间 存储指向堆中函数对象的指针
函数执行上下文 栈空间 调用时的参数、局部变量等临时数据
js 复制代码
let obj = {
  name: "pp",
  age: 18,
  health: 80,
  exercise: function () {//外部作用域是全局作用域
    console.log("快去运动");
    //health++错误写法
    obj.health++
    //内部作用域一定可以访问外部作用域,但是全局预编译的时,找全局变量声明 obj
  //而health是对象的属性,不是全局的,所以内部作用域找不到health,在其他语言可以,而js 不可以
  
  },
  sleep: function () {
    console.log("睡觉休息");
  },
};

obj.age++;
console.log(obj);
js 复制代码
function fn(){
  var a='p'
  var b=a
  var c={name:'pp'}
  var d=c

}
fn()

看了那么多,检验你的时候到了,以下代码结果是什么:

js 复制代码
function foo(person) {
  person.age = 20
  person = {
    name: '李四'
  }
  return person
}
let p1 = {
  name: '张三',
  age: 18
}
let p2 = foo(p1)

console.log(p1);
console.log(p2);

在全局执行上下文对象中,执行阶段先创建了一个person对象里面往堆存放张三,然后调用函数,进入函数执行上下文对象中,执行到person.age,对#001地址中age修改,当创建新的perosn对象时,由于内容不同,创建新的堆地址存储#002,然后返回#002,所以p2的地址是#002,打印p1时是的修改后的张三,打印p2结果是李四的

如有错误欢迎指正,欢迎各位友友评论点赞!

相关推荐
mldong33 分钟前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排1 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60612 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角3 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!3 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰3 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi5 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen5 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马6 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒6 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端