JavaScript基本类型和引用类型
1.1 基本数据类型和引用数据类型
ECMAScript可能包含两种不同的数据类型的值:基本数据类型和引用类型值。
基本数据类型:简单的数据段(Number、String、Null、Undefined、Boolean),是它自身的实际值。
eg: var age = 12;
引用数据类型:可能由多个值组成的对象(Array、Object),是一个指向该对象地址的一个指针。
eg: var arr = [1,2,3,4];
1.2 复制变量值
复制基本变量值 ,复制之后的两个值互相独立,互不影响。
var num1 = 1;
num2 = num1;
复制引用类型,也会将储存在变量中的值复制一份到为新变量分配的空间中(这个值是一个指针,指向储存在堆中的一个对象)。复制之后,两个值是指向同一个对象。
var obj1 = new Object();
var obj2 = obj1;
obj1.name = 'Beaver';
1.3 传递参数
ESMAScript中所有的函数都是按值传递的。基本类型值的传递就像基本类型值的复制一样,而引用类型的传递,则像引用类型变量的复制。访问变量的方式有按值和按引用两种,而传参只能值传递。
向参数传递基本类型时 eg:
function add(num) { num += 10; return num; } var count = 10; var result = add(count); console.log('count: '+count +", result: "+result); //count: 10, result: 20
向参数传递引用类型时 eg:
function setName(obj) { obj.name = "Beaver"; } var person = new Object(); setName(person); console.log(person.name); //Beaver
上述代码创建了一个对象person,将这个变量传递到setName()函数中被复制给obj.在这个函数内部,obj和 person引用的都是同一个对象。换句话说,即使这个值是按值传递的,obj也会按引用来访问同一个对象。
为了证明对象是按值传递的:
function setName(obj) { obj.name = "Beaver"; obj = new Object(); obj.name = "David"; } var person = new Object(); setName(person); console.log(person.name);//Beaver
在上述代码中,重新为obj定义了一个对象,给obj.name重新赋值,如果person是按照引用传递,那么person 就会被改为指向其name属性值为David的新对象。然而输出的依然是Beaver。这说明即使在函数内部修改了参数 的值,但原始的值仍然未改变。
1.3 检测类型
typeof是确定一个字符串、数值、布尔值,还是undefined的最佳工具。
var item1 = 'Beaver'; var item2 = 25; var item3 = true; var item4; var item5 = null; var item6 = new Object(); console.log(typeof item1);//string console.log(typeof item2);//number console.log(typeof item3);//boolean console.log(typeof item4);//undefined console.log(typeof item5);//object console.log(typeof item6);//object
当我们想检测某个值是什么类型的对象时,我们用instanceof。
语法:variable instanceof constructor //返回true或者false
var person = new Object(); var arr = []; console.log(person instanceof Object);//true console.log(arr instanceof Array);//true
所有引用类型的值都是Object的实例。