JS中基本类型和引用类型分别指的的是什么?有何区别?
分享人:朱春雨
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
JS基本类型
字符串可以是单引号或双引号中的任意文本。
数字(Number)
全局方法 Number() 转换成数字
布尔只有两个值:true、false。
undefined,null,NAN,"",0,false为false,其余全为true
空数组是true,对象也是true。
在js中写布尔和判断相关的代码时,都会要求遵循一定的编码规范:
用绝对等于===判断来代替等于==
能用绝对等于的地方永远用绝对等于而不要用等于==
因为绝对等于===会先判断数据类型,数据类型不同直接返回false
而等于==会先进行数据转换
同理推荐使用不绝对等于!==而不是不等于!=
例如
console.log('0'==0);//true
console.log('0'===0);//false
基本上就是
undefined等于undefined undefined等于null
NaN不等于任何 甚至不等于另一个NaN
空
类型只有一个值null。表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
在 JS 中表示"什么都没有",是只有一个值的特殊类型。
未定义
Undefined类型也只有一个值,当声明的变量还未被初始化时,变量的默认值为undefined。
一个没有值的变量会返回 undefined。
Symbol
生成一个全局唯一的值。
特点是唯一性,即使是用同一个变量生成的值也不相等。
引用数据类型:
对象(Object)
分为键和值
var name=
{
one : "53岁"; one是键,53岁是值
}
可以在对象里设置函数,引用函数需要加(),不加引用函数表达式,对象是全局属性
数组
数组下标是基于零的,所以第一个是 [0],第二个 [1],以此类推。可以用for循环获取下标
函数
声明一个函数 function one() {
//函数执行代码
}
引用方式 one()
匿名函数自执行
(function() {
//函数执行代码
})(); 打开网页自动执行
匿名函数放在变量中
var one=function() {
//函数执行代码
}
调用one()
函数放在数组中
var one=[];
one[0]=function() {
//函数执行代码} 调用one[0]()
函数在事件调用时不要写括号,比如one(),写成one
函数传参
function one(形参1,形参2){
//函数执行代码
}
one(实参1,实参2);//调用时传参
函数返回值即函数执行之后的返回结果。
所有函数都会有函数返回值,函数执行后一定会返回一个结果,如果没有定义默认返回undefined;
在函数中,return后定义返回值;return之后的代码就不会再执行了,只能用于函数中,用在其他地方会报错
引用类型是存放在堆内存中的对象,变量是保存的在栈内存中的一个指针,这个指针指向堆内存。
通过这个指针可以查找到保存在堆内存中的对象。
栈内存主要用于存储各种基本数据类型以及对象变量的指针,
而堆内存主要负责对象Object这种变量类型的存储。
栈内存
初始栈内存只有a,栈内存添加b,b复制a。此时b是10,栈内存b保存了另一个值,但是并不影响a的值。
new关键字生成的对象都是存在于堆内存中的,
变量 a 存在于栈内存中,他的值是一个指针,这个指针指向堆内存中的一个对象!
引用类型变量的值是指针,指向堆内存中的一块地址。
one1在栈内存中,值指向堆内存,one2等于one1,它们的指针指向一个堆内存对象,所以one1也可以访问one2
var a = [1,2,3,4,5];
var b = a;//传给变量的数据是引用类型的,会存储在堆中;
var c = a[0];//把对象中的属性/数组中的数组项赋值给变量,这时变量C是基本数据类型,存储在栈内存中;改变栈中的数据不会影响堆中的数据
console.log(b);//1,2,3,4,5
console.log(c);//1
//改变数值
b[4] = 6;
c = 7;
console.log(a[4]);//6
console.log(a[0]);//1
a在栈内存,b等于a,b复制了一份a的数组,在同一个栈内,所以修改b,a也会根据地址回到a堆中修改
c直接在栈中修改,不能指向a堆内存中。
1、声明变量时内存分配不同
原始类型:在栈中,因为占据空间是固定的,可以将他们存在较小的内存中-栈中,便于迅速查询变量的值
引用类型:存在堆中,栈中存储的变量,只是用来查找堆中的引用地址, 因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响
2、不同的内存分配带来不同的访问机制
在JS中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是按引用访问。
而原始类型的值则是可以直接访问到的。
3、复制变量时的不同
1)原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
2)引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)。多了一个指针
4、参数传递的不同(把实参复制给形参的过程)
原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点要时刻铭记在心!
因此它传递的值也就是这个内存地址。
https://blog.csdn.net/qq_34569497/article/details/95379260#1.%E5%87%BD%E6%95%B0%E6%A6%82%E5%BF%B5%EF%BC%8C%E5%A3%B0%E6%98%8E%E5%8F%8A%E8%B0%83%E7%94%A8