一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。
原始值
原始值就是简单的数据,包括undefined、Null、Boolean、Number、String、Symbol。原始值不能有属性,访问时需要按值访问(操作储存在变量中的实际值)
复制值
let num1 = 1
let num2 = num1
复制前
复制后
num2复制了num1的值,单独开辟一个空间存储。
引用值
又称为对象(Object),访问时按引用访问(操作该对象的引用),引用值有属性,可以随时添加、修改和删除。
复制值
1.let obj1 = new Object()
2.let obj2 = obj1
3.obj1.name = "a"
4.console.log(obj2.name) //a
第一句通过new关键字在堆内存中创建一个Object,栈内存中的obj1指向这个Object。第二句是将引用值从一个变量赋给另一个变量,方式与原始值不同。这时栈内存中obj2变量指向obj1指向的对象,通过这种方式完成引用值的复制值。第三句改变obj1指向的对象的属性,由于obj2指向相同的对象,所以输出a。
传递参数
注意:不论是原始值还是引用值,传参都只有按值传递。
1.function setName(obj) {
2. obj.name = "yy"
3. obj = new Object()
4. obj.name = "hello"
5.}
6.let p = new Object()
7.setName(p)
8.console.log(p.name) // yy
这段程序很多人会认为会输出hello,但是在setName中new的对象是本地对象,在函数执行完毕就被销毁了,这涉及到JS垃圾回收机制的内容,详情可以参考我的另一篇文章:JS的垃圾回收机制。