JavaScript 中基本类型和引用类型赋值的区别

JavaScript 中基本类型和引用类型赋值的区别

 

一、基本类型(Number、String、Undefined、Null、Boolean):

 

1.基本类型的值是不可变的,我们不能给基本类型添加属性和方法

 

验证:基本类型的值不可变

var person = "jozo";

// 添加age属性

person.age = 22;

console.log(person.age); // undefined

如图所示:

 

2.基本类型的比较是值的比较

var a = 1;

var b = true;

// == : 比较会先把true 转换为数字1

console.log(a == b, a === b); // true , false

如图所示:

 

var a = 10;

var b = true; // 转换成 1

// == : 比较 会先把true 转换为数字1

console.log(a == b); // false

如图所示:

 

var a = 0;

var b = false; // 0

// == : 比较 会把false 转换为数字0

console.log( a == b , a === b ) // true , false

如图所示:

 

 

// 基本类型,值的比较

var person1 = '{}';

var person2 = '{}';

console.log(person1 == person2); // true

如图所示:

 

3.基本类型的变量是存放在栈区的(栈区指内存里的栈内存),栈区包括了 变量的标识符和变量的值。

 

基本类型存储:

 

基本类型赋值过程:

var a = 10;

// 将a赋值给b

var b = a;

// 修改a,不会影响b的变化

a = 20;

// b = 10?

console.log("b = " + b + ", a = " + a);

 

4.基本类型赋值: 拷贝赋值,值的拷贝,赋值完成后,两个变量就没有任何联系了。

var a = 10;

// 将a赋值给b

var b = a;

// 修改a,不会影响b的变化

a = 20;

// b = 10?

console.log("b = " + b + ", a = " + a);

如图所示:

 

 

二、引用类型(数组、对象、函数):

 

1.引用类型的值是可变的,引用类型添加属性和方法,也可以删除其属性和方法

 

验证:引用类型是可变的

var person = {};

// 添加age属性

person.age = 22;

console.log(person.age); // 22

如图所示:

 

// 删除person 对象的age属性

delete person.age;

console.log(person.age) // undefined

如图所示:

 

2.引用类型的值是同时保存在栈内存和堆内存中的对象,.引用类型的赋值其实是对象保存在栈区地址指针的赋值,拷贝赋值,地址的拷贝

(-引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。)

 

引用类型存储:

 

引用类型存储过程:

// {} , [] , function(){} 在堆区创建一块存储区域,返回一个新的地址

var person1 = function() {};

var person2 = function() {};

console.log(person1 == person2); // false

如图所示:

 

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

如图所示:

 

 

3.引用类型的比较是引用的比较(地址/指针的比较)

var person1 = {};

var person2 = {};

var person3 = person2;

console.log(person1 == person2); // false

console.log(person3 == person2); // true

如图所示: