类型分类
简单类型又叫基本数据类型或者值类型,复杂类型又叫引用类型。
值类型:在存储时变量中存储的是值本身,因此叫做值类型。String、number、boolean、undefined、null。
引用类型:在存储时变量中存储的仅仅是地址(引用),可以通过new关键字构造的实例,如Object、Array、Function。
判断类型
- typeof 返回类型字符串
可以判断:undefined / 数值 / 字符串 / 布尔值 / Function
不能判断:null与object object与array - instanceof:
可以判断对象的具体类型 (函数和数组是特别的对象) - ===
可以判断:undefined,null
undefined和null的区别
undefined:代表定义未赋值
null:定义并赋值,只是值为null
注意:当变量赋值为null时,第一种,初始化赋值,表明将要赋值为对象。第二种,让对象成为垃圾对象(被垃圾回收器回收)
堆和栈
简单数据类型存放在栈里面直接存放值。
复杂数据类型的变量存放在栈,栈中存放引用地址(堆地址)。而值存放在堆中。
变量类型的存储方式
简单数据类型传参
//调用函数相当于将实参赋值给形参
var num = 10;
var num = 20;
console.log(num);//结果为20
var num1 = 30;
function add(times) {//times = num1
times = times*10
console.log(times);//结果300
}
add(num1);
console.log(num1);//结果30
首先我们声明了一个变量num并为他在栈中开辟了一个空间存放10,然后num=20则将空间的值改为20, 而num1在栈中开辟一个存放30的空间,而timers复制了num1的值并在栈中开辟一个空间,所以函数中不会影响到num1的值
复杂数据类型传参
function Person(name) {
this.name = name;
}
function f1(x) { //x = p
console.log(x.name);//张学友
x.name = '黎明';
console.log(x.name);//黎明
}
var p = new Person('张学友');
console.log(p.name);//结果张学友
f1(p);
console.log(p.name);//黎明
var p = new Person('张学友');在栈中开辟了一个p的空间存放地址,new Person('张学友');在堆中存放。f1(p) 中x复制了一份p的空间所以x存放的是指向上面new Person('张学友');的地址, x和p指向同一个堆空间地址。所以最后输出的是console.log(p.name);//黎明