Js值类型和引用类型

   由JavaScript 中的变量类型传递方式,分为值类型和引用类型,值类型变量包括 Boolean、String、Number、Undefined、Null,引用类型包括了 Object 类的所有,如 Date、Array、Function 等。在参数传递方式上,值类型是按值传递,引用类型是按共享传递。

    值类型和引用类型的区别:

    (1)值类型:

a:  占用空间固定,保存在栈中(当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;栈中存储的是基础变量以及一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。

b:  保存与复制的是值本身

c:  使用typeof检测数据的类型

d:  基本类型数据是值类型


(2)引用类型:

a:  占用空间不固定,保存在堆中(当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。)

b:  保存与复制的是指向对象的一个指针

c:  使用instanceof检测数据类型

       d:  使用new()方法构造出的对象是引用型


//值类型
let a = 1
let b = a
b = 2
console.log(a) //1
console.log(b) //2
			
//引用类型
let c = {x:1,y:2}
let d = c
d.x = 10
d.y = 20
console.log(c) //{x:10,y:20}
console.log(d) //{x:10,y:20}

a,b都是值类型修改其赋值,相互之间没有影响,而c,d是应用类型,都指向同一个内存地址,修改其中一个值,都会引起另一个改动。

let obj = {
				a: 1,
				b: [1,2,3]
			}
			let a = obj.a
			let b = obj.b
			a = 2
			b.push(4)
			console.log(a) //2
			console.log(b) //[1,2,3,4]
			console.log(obj) //{a:1,b:[1,2,3,4]}
对象obj虽然是引用类型,但是内部的a,b分别是值类型和引用类型,在外部修改a的值不会影响obj.a .





猜你喜欢

转载自blog.csdn.net/Ace_with_Yu/article/details/80576548