数据类型
一、JavaScript 数据类型
原始类型(基本类型) :
- string:文本数据
- number:整数/浮点数
- boolean :逻辑值(
true
/false
) - null :空值(
typeof null === 'object'
是历史遗留问题) - undefined:未定义值(声明未赋值的变量)
- symbol :唯一不可变值(
Symbol('id')
) - bigint :大整数(
9007199254740991n
,解决Number.MAX_SAFE_INTEGER
限制)
引用类型(复杂类型) :
- Object :键值对集合(
{ name: 'John' }
) - Array :有序列表(
[1, 2, 3]
) - Function :可执行对象(
function() {}
) - Date :日期时间(
new Date()
) - 其他内置对象:如
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结果是李四的

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