小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
什么是原始值与引用值
JS 中的变量分为两种类型:原始值与引用值。
原始值:
原始值即一些代表原始数据类型的值,也叫基本数据类型,直接将值存在栈中。当一个原始变量把值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,此时这两个变量互不影响,即当一个变量值改变时,另一个变量不会因此而发生任何变化。
如 undefined、null、Boolean、Number、String、Synmbol,都是原始值。
var a = 10 ;
var b = a ;
a = 20;
console.log(b); //输出10 b的值不会因a的值的改变而该改变
引用值:
引用值是由多个值构成的对象,引用值实际上是把指针(可以理解为指向存储变量实际位置的地址)存储在栈中,而把可以操作的对象内容存储在堆中。
如Object,function,Array,RegExp,Data对象都是引用类型。
在把引用值从一个变量赋给另一个变量时,这里复制的值实际上是一个指针,它指向存储在堆内存中的对象。操作完成后,两个变量实际上指向同一个对象,因此一个对象上面的变化会在另一个对象上反映出来,如下面的例子所示:
let obj1 = new Object();
obj1.name = 'Nich';
let obj2 = obj1;
console.log(obj2.name); //'Nich
在这个例子中,变量obj1保存了一个新对象的实例。然后,这个值被复制到obj2,此时两个变量都指向了同一个对象。在给obj1创建属性name并赋值后,通过obj2也可以访问这个属性,因为它们都指向同一个对象。
注意:
- 确定变量类型时,原始值可以用 typeof,引用值需要用 instanceof
- 函数传递参数时都是按值传递的