js笔记

原始值

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中的寄存器,数据可以共享;
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

堆:堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值