基本变量类型 和引用类型 知识点

 ECMAScript 变量可能包含两种不同数据类型的值:
基本类型值和引用类型值
基本类型值指的是保存在栈内存的简单的数据段,即这种值完全保存在内存中的一个位置。而引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
  基本类型是按值访问的。
   引用类型的值,由于这种值的大小不固定,因此不能把它们保存到栈内存中。(大小固定)但内存地址的大小事固定的,因此可以将内存地址保存在栈内存中。当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
动态属性 
 定义基本类型值和引用类型值得方式是相似的;创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。
 var box=new Object(); //创建引用类型
 box.name='Lee';//新增一个属性
 alert(box.name);//"Lee"

如果是基本类型的值添加属性

 var box="Lee";
 box.age=27;
 alert(box.age);//undefined
这说明:只能给引用类型值动态地添加属性

复制变量值
基本类型值:会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。(复制的是值本身)
var num1=5;
var num2=num1;

引用类型值:同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。(复制的是地址)
 
var obj1=new Object();
var obj2=obj1;
obj1.name="Lee";
alert(obj2.name);//'Lee'

传递参数(按值传递)
function setName(obj){
   obj.name="Lee";
   obj=new Object();
   obj.name="Greg";
 }
var person =new Object();
setName(person);
alert(person.name);//"Lee"
如果person 是按引用传递的,那么person就会自动被修改为指向其name属性值为“Greg”的新对象。但是没有,这说明即使在函数内部修改了参数的
值,但原始的饮用仍然保持未变。
检测类型
typeof 检测基本类型
instanceof()检测引用类型










<think>好的,我现在需要回答用户关于JavaScript中基本数据类型引用数据类型的定义及区别的问题。首先,我需要回忆一下相关的知识,并结合提供的引用资料来组织答案。 用户的问题很明确,要求详细解释这两者的定义区别。根据引用资料,基本数据类型包括string、number、boolean、undefined、null、symbol(ES6新增),而引用数据类型主要是对象,如Object、Array、Date、Function等。首先,我需要明确这两者的基本定义,然后逐一对比它们的区别。 接下来,我需要从存储位置、赋值方式、比较方式、内存管理等方面展开区别。引用资料中提到,基本数据类型存储在栈内存中,而引用数据类型的地址存在栈中,数据存在堆里。赋值时,基本类型是复制值,引用类型是复制地址。比较时,基本类型比较值,引用类型比较地址。这些都是关键点。 此外,需要注意特殊类型如nullundefined的区别,虽然它们都是基本类型,但null表示空对象指针,而undefined表示未定义。symbol是ES6新增的,具有唯一性,这部分也需要提到。 用户可能还关心实际应用中的影响,比如函数参数传递时的不同表现。基本类型传值,不会影响原变量引用类型传地址,函数内部修改会影响外部变量。这个例子能帮助理解两者的不同行为。 需要检查是否有遗漏的区别点,比如内存管理方面,基本类型由系统自动回收,引用类型则需要解除引用才能被回收。此外,深拷贝浅拷贝的问题也可能相关,但用户的问题可能不需要深入到这里,不过可以简要提及。 最后,确保语言清晰,结构分明,分点说明定义区别,并给出实际例子帮助理解。同时,按照用户要求,生成相关问题,引导进一步学习。例如,如何判断数据类型、深拷贝的实现方法等。</think>### JavaScript基本数据类型与引用数据类型详解 #### 一、定义与分类 1. **基本数据类型(Primitive Types)** - 包括7种类型:$string$、$number$、$boolean$、$undefined$、$null$、$symbol$(ES6新增)、$bigint$(ES2020新增)[^3][^4] - 特点:直接存储具体值,占用固定内存空间。 2. **引用数据类型(Reference Types)** - 包括:$Object$、$Array$、$Function$、$Date$、$RegExp$等[^2][^3] - 特点:存储内存地址,实际数据保存在堆内存中。 --- #### 二、核心区别对比 ||基本数据类型|引用数据类型| |---|---|---| |**存储位置**|栈内存直接存储值|栈内存存地址,堆内存存数据[^2][^4]| |**赋值行为**|复制值本身|复制地址(多个变量指向同一数据)[^2]| |**比较方式**|比较值是否相等|比较地址是否相同[^4]| |**内存管理**|固定大小,自动回收|动态扩展,需解除引用才能回收| |**函数传参**|传递值的副本|传递地址的副本(影响原数据)| --- #### 三、实际场景示例 1. **赋值与修改** ```javascript // 基本类型 let a = 10; let b = a; // 复制值 b = 20; // a仍为10 // 引用类型 let arr1 = [1,2]; let arr2 = arr1; // 复制地址 arr2.push(3); // arr1变为[1,2,3] ``` 2. **比较操作** ```javascript 5 === 5 // true(值比较) [] === [] // false(地址不同) ``` 3. **函数参数传递** ```javascript function change(val) { val = 100; // 不影响外部基本类型变量 } let num = 50; change(num); // num仍为50 function modify(arr) { arr.push(4); // 修改会影响外部引用 } let list = [1]; modify(list); // list变为[1,4] ``` --- #### 四、特殊类型说明 - **$null$与$undefined$** - $undefined$:声明未赋值的变量默认值 - $null$:需显式赋值的空值,常用于对象占位[^4] - **$symbol$的独特性** ```javascript let s1 = Symbol('key'); let s2 = Symbol('key'); s1 === s2 // false(唯一性) ``` --- #### 五、应用注意事项 1. **深拷贝解决方案** ```javascript // 简单实现 const deepCopy = obj => JSON.parse(JSON.stringify(obj)); ``` 2. **类型检测方法** - `typeof`:适合基本类型(除null返回object) - `instanceof`:检测引用类型 - `Object.prototype.toString.call()`:精确判断所有类型 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值