javascript值和引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript值和引用相关的知识,希望对你有一定的参考价值。

javascript引用指向的是值。

简单值(即标量基本类型值,基本类型值,js中6类,null、undefined、boolean、number、string和symbol)总是通过值复制的方式来赋值/传递。

技术分享

以数值为例,此时,变量a持有该值的一个复本,变量b持有他的另一个复本,不论b进行什么样的操作,也不再会影响a的值。

 

复合值——对象(包括数组和封装对象)和函数,则总是通过引用复制的方式来赋值/传递。

技术分享

以数组为例,a和b分别指向同一个复合值[1,2,3]的两个不同引用,仅仅是指向,而非持有,所以如果a和b其中之一发生更改,其实他们更改的还是原数组,随后他们还是会指向更改后的新值[1,2,3,4]。

换一种操作b的方式:

技术分享

此时,对b进行赋值操作,将另外一个数组赋值给b,b就不再是引用a的指向,并与a的指向值再没有任何关系,所以b的操作也不再影响到a指向的值。

 

函数参数经常让人产生困惑:

技术分享

仅仅这样的操作,一般情况下,也都能理解。

技术分享

这种情况下,就会产生各种困惑,利用前文所说的对复合值进行赋值操作,并不会对所引用目标值的值产生任何影响,即对x赋值[4,5,6],并不会对a所引用的数组的值产生任何影响,所以a依然为[1,2,3,4]。

技术分享

此时在函数体中,没有进行任何赋值类的操作,x操作的一直都是数组的引用值,所以push新数值之后,就是对其所引用的值做了修改,a指向的也是更改后的新值[4,5,6,7]。

关于json对象的操作,原理与数组差不多。

简单标量基本类型值(字符串和数字等)通过值复制来赋值/传递,而复合值(对象等)通过引用赋值来赋值/传递。

以上是关于javascript值和引用的主要内容,如果未能解决你的问题,请参考以下文章

javascript值和引用

javaScript的引用值和原始值的存放位置

JavaScript中原始值和引用值传递

javascript中的原始值和复杂值

JavaScript的变量,作用域和内存问题

关于javascript内存分配