JavaScript中包含两种数据类型的值:基本类型和引用类型
定义
- 基本类型:简单的数据段
- 引用类型:可能由多个值构成的对象
访问方式
- 基本类型:按值访问,因为可以操作保存在变量中实际的值
- 引用类型:引用类型的值是保存在内存中的对象,JavaScript不允许直接访问内存中的位置,所以在操作对象时是在操作对象的引用而不是实际的对象,故是按引用访问的.
动态属性
可以为引用类型动态地添加属性,但是基本类型不可以,虽然不会出错,但不会为其添加上属性.
let obj = new Object();
obj.name = "tom";
let name = 'person';
person.age = 12;
alert(obj.name); //tom
alert(name.age); // undefined
复制变量的值
基本类型复制:
会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,复制完成后num1和num2完全独立,各自的任何操作都不会影响对方
let num1 = 5;
let num2 = num1;
num2 ++;
alert(num1);//5
alert(num2);//6
引用类型复制
当从一个变量到另一个变量复制引用类型的值时,也会将存储在变量对象中的值复制一份放到新变量分配的位置上,但是这个值的副本是一个指针,复制结束后,两个指针指向存储在堆中的同一个对象,因此一个的操作会直接影响另一个.
let obj1 = new Object();
let obj2 = obj1;
obj1.name = 'tom';
alert(obj2.name);//tom
传递参数
ECMAScript中所有函数的参数都是按值传递.即使引用类型是按引用访问,但在参数传递时依然是按值传递.
可以把函数的参数想象成局部变量.
检测类型
typeof:确定一个变量是字符串,数值,布尔值,还是undefined.但如果测一个引用类型或者NULL我们只会得到object,为了确定一个引用类型到底是哪种引用类型,我们会用instanceof
let a = 'haha';
let b = new Object();
let c = null;
let d = [1,2];
alert(typeof a);//string
alert(typeof c);//object
alert(b instanceof Object); //true
alert(d instanceof Array); //true
存储位置
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中.
引用类型的值是对象保存在堆内存中.
网友评论