原始值与引用值笔记
原始值
1.概念:原始值是存储在栈中的简单数据段,它们的值直接存储在变量访问的位置。原始值表示表示单一的数据,保存原始值的变量是按值访问,操作存储在变量内存中的实际值。ES中设计了6种原始值:Undefined、Null、Boolean、Number、String和Symbol(补充bigint)。
引用值
1.概念:引用值存储在堆中的对象,存储在变量处的值是一个指针,指向存储对象的内存处引用值表示表示有多个值(原始值或其他引用值)构成的对象。实际操作对象时,访问的是保存对象的内存地址,即该对象的引用(ES不允许直接访问对象的内存空间)。
原始值VS引用值
1. 动态属性(原始值不可改变,但是引用值可以增加、删除、更改属性和方法)。
原始值没有属性,举例如下图。(由于原始值没有属性,所以当利用属性索引的时候,返回值为undefined)
2. 值传递(原始值的传递是引用的过程,引用值的传递是复制的过程)
如下为原始值的值传递过程
如下为引用值的传递过程
总结: 如果参数类型是原始值,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值。如果在函数中改变了副本的值不会改变原始的值.。 如果参数类型是引用值,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
3.确实类型
- 通过typeof来判断值是原始值还是引用值,如果是原始值则返回值类型,如果是引用值则返回oobject。(示例如下)
2.Typeof只能判断是原始值还是引用值,但是对引用值的意义不大。通过instanceof操作符,判断引用值是否为某个构造函数的实例,返回值为true或者false.(举例如下)
4.原始值的包装类型
在js中的原始值,可以调用方法,但是却不能给原始值添加属性举例如下:
(在非严格模式下,当我们给原始值赋值时one.age=20,其实是生成了一个原始值包装类型的,也是给它赋了值的,但是,这句话执行完之后,这个原始值包装类型就被销毁了。而在下一次再次读取这个属性时one.age,其实又再次创建了一个原始值包装类型对象,这个对象和之前那个不是一个对象,所以one.age为undefined)
出现这种结果和原始值包装类型及其声明周期有关:每当用到某个原始值的属性或者方法使,javascript总会在后台创建一个原始值包装类型的对象,从而暴露出操作原始值的各种方法。
在以读模式访问字符串的方法或者属性时,总会在后台执行以下三步:
(1)创建一个包含了原始值的String类型的实例
(2)调用这个实例上的方法(或读取这个实例上的属性)
(3)销毁这个实例
标签:副本,对象,笔记,原始,引用,参数,属性 来源: https://www.cnblogs.com/liuxiaobaiyaonixi/p/14618952.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。