JS数据类型,浅拷贝和深拷贝

JavaScript共有7种数据类型,分为两种:基本类型和引用类型。基本类型包括Null,Undefined,Boolean,Number,String和ES6中新增的symbol;引用类型统称为Object(包括Array,Date,RegExp,Function)。基本类型值和引用类型值有很多不同之处:
1.基本类型值在内存中占据固定大小的空间,因此会被保存在栈内存中;引用类型的值是对象,保存在堆内存中(堆和栈都是内存中划分出来用来存储的区域,
栈(stack)为自动分配的内存空间,它由系统自动释放;而堆(heap)则是动态分配的内存,大小不定也不会自动释放);而且包含引用类型值的变量实际上包含的并不是对象本身,而是指向该对象的指针。
2.从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本,二者不会互相影响。而从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量实际上指向同一个对象。
3.基本类型的值进行比较时比较的是值是否相等,而引用类型值在比较时比较的是存储地址是否相等

确定一个值是哪一种基本类型值可以用typeof 操作符:

1
2
3
4
5
6
7
8
9
10
11
12
13
var s = 'jack';
var b = false;
var i = 23;
var u;
var n = null;
var o = new Object();

console.log(typeof s); // string
console.log(typeof b); // bolean
console.log(typeof i); // number
console.log(typeof u); // undefined
console.log(typeof n); // obejct
console.log(typeof o); // object

对于引用类型值的时候,typeof均返回object。可以使用instanceof(是···的实例)操作符:

1
2
3
person instanceof Array;  //person是Array的是实例么?
person instanceof RegExp; //person是RegExp的是实例么?
person instanceof Object; //person是Object的是实例么?

基本数据类型的赋值是传值,在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中:

1
2
3
4
5
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10

而引用类型的赋值是传(地)址,只是改变指针的指向,例如,也就是说引用类型的赋值是对象保存在栈中的地址的赋值,这样的话两个变量就指向同一个对象,因此两者之间操作互相有影响

1
2
3
4
5
6
7
8
9
var a = {}; // a保存了一个空对象的实例
var b = a; // a和b都指向了这个空对象
a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'
b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22
console.log(a == b);// true

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×

keyboard_arrow_up