JS 的基本数据类型和引用数据类型的区别

本文探讨了JavaScript中基本数据类型和引用类型的差异。基本数据类型不可变且无法添加属性和方法,赋值时会创建新值并复制。而引用类型可以改变,赋值时传递的是对象引用。在比较时,基本类型比较值,引用类型比较内存地址。此外,还提到了NaN的特性,它是表示非数字的特殊值,不等于任何值,包括自身。

  基本数据类型的值是不可变的,任何方法都无法改变一个基本类型的值,当这个变量重新赋 值后看起来变量的值是改变了,但是这里变量名只是指向变量的一个指针,所以改变的是指针的 指向改变,该变量是不变的,但是引用类型可以改变。

  基本数据类型不可以添加属性和方法,但是引用类型可以。
基本数据类型的赋值是简单赋值,如果从一个变量向另一个变量赋值基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,引用数据类型的赋值是对象引用。

  基本数据类型的比较是值的比较,引用类型的比较是引用的比较,比较对象的内存地址是否相同。

  基本数据类型是存放在栈区的,引用数据类型同事保存在栈区和堆区。

  NaN 是 JS 中的特殊值,表示非数字,NaN 不是数字,但是他的数据类型是数字,它不等于任何值,包括自身,在布尔运算时被当做 false,NaN 与任何数运算得到的结果都是 NaN,当算失败或者运算无法返回正确的数值的就会返回 NaN,一些数学函数的运算结果也会出现NaN。

JavaScript数据类型分为基本数据类型引用数据类型,二者存在多方面的区别: 1. **数据构成**:基本类型值指的是简单的数据段;引用类型值指的是那些可能由多个值构成的对象,Object(对象)类型数据是一组由键、值组成的无序的数据集合,定义对象类型的数据需要使用`{}` 或者使用Object函数,例如`var person={ name:'小白', age:18, height:180 }`,其中`name`、`age`、`height` 为`person`对象中的键,`小白`、`18`、`180` 为`person`对象的值 [^1][^3]。 2. **解析过程**:暂未在给定引用中获取到明确解析过程不同的具体内容。 3. **内存分配与访问机制**:地址大小固定,存储在栈中对变量性能无负面影响。不同的内存分配机制带来了不同的访问机制。在JavaScript中不允许直接访问保存在堆内存中的对象,访问一个对象,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,即按引用访问;而原始类型的值则可以直接访问 [^4]。 4. **复制变量区别**:原始值在将一个保存着原始值的变量复制给另一个变量,会将原始值的副本赋值给新变量,此后这两个变量完全独立,只是拥有相同的值;引用值在将一个保存着对象内存地址的变量复制给另一个变量,会把这个内存地址赋值给新变量,这两个变量都指向了堆内存中的同一个对象,任何一个作出的改变都会反映在另一个身上,复制对象并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量 [^4]。 5. **参数传递的区别**:ECMAScript中所有函数的参数都是按值来传递的。原始值只是把变量里的值传递给参数,之后参数这个变量互不影响;引用值对象变量里面的值是这个对象在堆内存中的内存地址,因此它传递的值也就是这个内存地址,函数内部对这个参数的修改会体现在外部,因为它们都指向同一个对象 [^4]。 ### 示例代码说明复制变量的区别 ```javascript // 基本数据类型复制 let num1 = 10; let num2 = num1; num2 = 20; console.log(num1); // 输出10,num1不受num2改变的影响 console.log(num2); // 输出20 // 引用数据类型复制 let obj1 = { value: 10 }; let obj2 = obj1; obj2.value = 20; console.log(obj1.value); // 输出20,obj1的值被obj2的修改影响 console.log(obj2.value); // 输出20 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值