(一).简单数据类型和复杂数据类型
简单数据类型又叫做基本数据类型或者值类型;复杂数据类型又叫做引用类型
1.值类型:简单数据类型/基本数据类型,在存储变量中存储的是值本身,因此叫做值类型
srtring,number,boolean,undefined,null
注意:除了null其余均返回数值本身,typeof null=>返回空对象obj
var tempt = null ; console.log(typeof tempt) =>输出空对象{}
此特点用途:有个打算以后存储为对象的变量,暂时还没想好啥在里面,这时候就给此变量为null
2.引用数据类型:复杂数据类型,在存储时变量中存储的仅仅是地址,因此叫做引用数据类型
通过new关键字创建的对象(系统对象/自定义对象),如Object/Array/Date等
(二).堆和栈
堆栈空间分配区别:
1.栈(操作系统):由操作系统自动分配释放存放函数的参数值/局部变量的值等,其操作方式类似于数据结构中的栈;简单数据类型存放到栈里面
2.堆(操作系统):复杂数据类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收,复杂数据类型放到堆里面
注意:JS中没有堆和栈的概念,通过堆栈的方式,可以更理解代码的执行方式,便于其他语言的学习
(三).简单类型的内存分配
简单数据类型,存放到栈里面,在栈中开辟一个内存空间存放值
(四).复杂类型的内存分配
复杂数据类型首先在栈中存放地址,用十六位进制数表示,然后这个地址指向堆里面
arr=>栈中存储复杂类型地址=>堆中存储复杂类型的值
(五).简单类型传参
函数的形参也可以看作是一个变量,当我们把一个类型变量作为参数传递给函数的形参时,其实是把变量在栈空间中的值复制了一份给形参,那么在方法对形参做任何修改,都不会影响到外部变量
(六).复杂类型传参
函数的形参也可以看作是一个变量,当我们把引用数据类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象.
function Person(name){
this.name = name
}
function f1(x){
console.log(x.name); //2 刘德华
x.name = "张学友"
console.log(x.name); //3 张学友
}
var p = new Person("刘德华");
console.log(p.name); //1 刘德华
f1(p);
console.log(p.name) //4 张学友
x.name = "张学友"执行后,改变了原有Person,name的值