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结果是李四的

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

相关推荐
爱生活的苏苏5 分钟前
vue生成二维码图片+文字说明
前端·vue.js
拉不动的猪7 分钟前
安卓和ios小程序开发中的兼容性问题举例
前端·javascript·面试
炫彩@之星13 分钟前
Chrome书签的导出与导入:步骤图
前端·chrome
贩卖纯净水.24 分钟前
浏览器兼容-polyfill-本地服务-优化
开发语言·前端·javascript
前端百草阁30 分钟前
从npm库 Vue 组件到独立SDK:打包与 CDN 引入的最佳实践
前端·vue.js·npm
夏日米米茶31 分钟前
Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法
前端·windows·npm
且白1 小时前
vsCode使用本地低版本node启动配置文件
前端·vue.js·vscode·编辑器
程序研1 小时前
一、ES6-let声明变量【解刨分析最详细】
前端·javascript·es6
siwangqishiq21 小时前
Vulkan Tutorial 教程翻译(四) 绘制三角形 2.2 呈现
前端
李三岁_foucsli1 小时前
js中消息队列和事件循环到底是怎么个事,宏任务和微任务还存在吗?
前端·chrome