持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
上一篇文章讲述了js的数据类型有哪些,今天谈谈对数据类型的简单理解。
基本数据类型的值指的是简单的数据段,引用数据类型指的是可能有多个值构成的对象。可以从下面几个方面来理解:
1. 值的存储
基本数据类型的值存储在栈中; 引用数据类型的值存储在堆中,同时在栈中会有相应的堆地址(指针),指向堆的位置。
2. 值是否可变?是否可以动态改变属性?
定义基本数据类型和引用数据类型的值,都是创建一个变量并为该变量赋值。
基本数据类型的值无法改变; 引用数据类型的值可以改变,可以为其添加、改变和删除其属性和方法。
var person = new Object(); //创建一个对象并将其保存在变量person中
person.name = "Song"; //为该对象添加一个名为name的属性,并赋值为Song
console.log(person.name); //访问name这个属性 结果为Song
3. 赋值
一个变量向另一个变量复制(基本数据类型或引用数据类型的)值时,两则的区别:
-
基本数据类型的值
当变量赋值时,会重新创建一个新值将其复制到为新变量分配的位置上,此时两个变量各自拥有属于自己的独立的内存空间,因此两者可以参与任何操作而不会相互影响。
var a = 1; var b = a; b = 2; console.log(a);//1 console.log(b);//2 -
引用数据类型的值
当复制引用数据类型的值时,复制的不是堆内存中的值,而是将栈内存中的地址复制过去,复制操作结束后,两个对象实际上都指向堆中的同一个地方。因此改变其中一个对象(堆中的值改变),那么会影响到另一个对象。
var obj1 = { name:"Song" }; var obj2 = obj1; obj2.name = "D"; //改变obj2的name属性的值,则将obj1的也改变了 console.log(obj1.name);// D
4. 传参(函数的形参可以看做是一个变量)
-
基本数据类型传参
当我们把一个基本类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。
-
引用数据类型传参
当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。
function test(person){ person.age = 26; person = { //重新开辟了一个内存空间,然后将此内存空间的地址赋给person,可以理解为将刚才指向p1的指针地址给覆盖了,所以改变了person的指向 name:'张三', age:30 } return person } const p1 = { name:'李四', age:25 }; const p2 = test(p1);//将p1的内存地址指针复制给了形参person,两者引用的是同一个对象,这个时候在函数中改变变量,就会影响到外部。 console.log(p1);//{name: "李四", age: 26} console.log(p2);//{name: "张三", age: 30}