原始值
1.原始值指的是 原始类型 的值,也叫 基本类型,例如 Number、Stirng、Boolean、Null、Underfined 。
2.存储在栈(stack)中的简单数据段,它们的值直接存储在变量访问的位置。
原始变量类型及他们的值存储在栈中,当把一个原始变量传递给另一个原始变量时,是把一个一段栈空间的内容复制到另一段栈空间,这两个原始值互相不影响。
var x = 9; //9就是一个原始值,变量x中存放的就是原始值本身9
引用值
1.引用值指的是 引用类型 的值,例如 Object、Function、Array、Date、RegExp 。
2.存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
引用值是把引用变量的名称存储在栈中,但是把其实际对象存在堆中,且存在一个指针有变量名指向存储在堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针,此时,若通过方法改变其中一个变量的值,则访问另一个变量时,其值也会随之加以改变;但若不通过方法,而是通过重新赋值 此时 相当于 重新开了一段内存 该值的原指针改变 ,则另外一个 值 不会随他的改变而改变。
var o = {}; //{}这个对象是一个引用值,注意变量o中并没有存放这个对象,而是存放的这个对象的指针
引用值和原始值的区别
1.赋值方式不同
原始值是以值的拷贝方式赋值,值是不可变的。
引用值是以引用的拷贝方式赋值,值是可变的。
//原始值
var a = 9;
var b = a;
a = 10;
document.write(b);//9;
//引用值
var arr1 = [10];
var arr2 = arr1;
arr1.push(8);
document.write(arr2);/*10,8;
类似于C语言中的指针。
2.比较方式不同
原始值的比较是 值 的比较
引用值的比较是 引用 的比较
//原始值
var a = 1;
var b = true;
console.log(a == b); //true
console.log(a === b); //false
//引用值
var obj1 = {};
var obj2 = {};
console.log(obj1 == obj2); //false
console.log(obj1 === obj2); //false
原始值 a 和 b 的数据类型不同,但也可以进行值的比较。(在值比较之前,自动进行了数据类型的 隐式转换)
=== 不仅比较直还比较其类型
引用值 obj1 和 obj2 分别引用的是存放在堆内存中的两个不同的对象,所以 obj1 和 obj2 的值(地址引用)不一样。
栈和堆
在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,以及对象变量的指针,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。**
堆内存主要负责像对象Object这种变量类型的存储
栈和堆的区别
栈:所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁。
优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享;
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
堆:堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。