手机版

JavaScript数据运算_论原值与参考值的运算本质

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

我用一句话总结:无论是变量赋值还是函数传递,原值都不会变;如果重新分配新变量,则不会影响原始参考值;如果直接操作新变量,会影响原始参考值。

首先,很明显,值和类型是两个不同的概念。例如,null是null类型的唯一值,undefined是undefined类型的唯一值,true和false是布尔类型的唯一两个值。在任何语言中,价值观的运作可以概括为以下三个方面。

复制值:给新变量赋值,或者通过变量给另一个变量、属性或数组元素赋值。

传递值:也就是将值作为参数传递给函数或方法。

比较值:即将一个值与另一个值进行比较,看是否相等。

由于值类型数据和引用类型数据的取值形式不同,自然操作它们的方法和结果也不同。请注意,当值是值类型数据时,我们通常称之为原始值或基本值。当值是参考数据时,我们通常称之为参考值或复合值。

1.使用原始值

对于原值,其操作的三个方面描述如下。

1)复制值

在赋值语句中,操作过程将产生一个实际值的副本。复制值和实际值之间没有联系,它们位于不同的堆栈区域或堆区域。这个副本可以存储变量、对象属性和数组元素。例如:

var n=123,a,b=[],c={ };a=n;//复制数字123 b[0]=n;//复制数字123 c . x=n;//复制数字123(a==b[0])(a==c . x)(b[0]==c . x)alert('所有复制的值都相等');//检查它们的值是否都相等。在上面的例子中,值123分三次复制到变量a、数组b和对象c。虽然他们的价值观是平等的,但他们是相互独立的。

2)传递值

当值传递给函数或方法时,传递的值只是一个副本,而不是值本身。例如,如果在函数中修改传入的值,结果只能影响参数值的副本,而不会影响原始值。

var a=123//原值函数f(x){ x=x x;} f(a);//调用函数修改传递的值alert(a);//检查变量A的值是否受到影响。返回值为123,表示没有变化。3)比较值

在上面的例子中,我们还可以看到,当比较原始值时,我们逐字节比较它们,以确定它们是否相等。比较是值本身,而不是值的位置。虽然比较结果可能相等,但它只显示它们包含的字节信息是相同的。

2.使用参考值

对于参考值,其操作的三个方面描述如下。

1)复制值

在赋值语句中,赋值是对原始值的引用,而不是原始值的副本,更不用说原始值本身了。也就是说,赋值之后,所有的变量都保存对原值的引用(即原值的存储地址)。在多个变量、数组元素或对象属性之间复制时,它们都与原始变量保存的引用相同。

所有引用都具有相同的效果和功能,并且可以执行操作。如果通过其中一个引用编辑数据,此修改将反映在原始值和其他相关引用中。例如:

var a=[1,2,3];//赋值数组引用b=a;//复制值b[0]=4;//修改变量b中第一个元素的值alert(a[0]);//返回4,表示变量A中第一个元素的值也修改为4。但是,如果给变量B一个新值,这个新值不会影响原来的值。例如:

var a=[1,2,3];//赋值数组引用b=a;//复制值b=4;//覆盖变量b的赋值警告(a[0]);//变量A的内容不变。重复赋值实际上涵盖了变量对原始值的引用,并成为另一个值的副本或对它的引用。因此不会影响原值,演示图如图4-2所示。

2)传递值

当数据通过引用传递给函数时,传递给函数的也是对原始值的引用。函数可以使用这个引用来修改原始值本身,任何修改在函数外部都是可见的。例如:

var a=[1,2,3];函数f(x){ x[0]=4;//修改函数{ f(a)}中的参数值;//传递参考值警报(a[0]);//返回4,原值改变。请注意,对外部对象或数组的引用是在函数中修改的,而不是对象或数组本身的值。在函数中,可以使用引用来修改对象或数组元素的属性。但是,如果在函数内部使用新的引用来覆盖原始引用,函数内部的修改不会影响原始引用的值,并且在函数外部不可见。

var a=[1,2,3];函数f(x){ x=4;//修改函数{ f(a)}中的参数值;//传递参考值警报(a[0]);//返回1,原值不变。3)比较值

当比较两个参考值时,我们比较两个参考地址,看它们引用的原始值是否是相同的副本,而不是比较它们的原始值是否以字节为单位相等。当引用两个不同的值时,尽管它们具有相同的字节组成,但这两个引用的值并不相等。

var a=新数字(1);//参考值a var b=新数字(1);//参考值b var c=a;//将a的引用赋给c alert(a==b);//返回假警报(a==c);//返回true,因此{ }={ },[]==[]都返回false。因为参考地址不同。

总之,对于任何语言来说,使用值和使用引用是数据操作的两种基本方法。当我们操纵数据时,用什么方法处理主要取决于数据的类型。值类型数据和引用类型数据以不同的方式参与操作。值类型数据通过使用值对数据进行操作,而引用类型数据通过使用引用对数据进行操作。不同的运营模式自然会产生不同的结果。让我们看另一个例子:

var s=' abc//字符串,值类型数据var o=新字符串;//string对象,装箱字符串函数f(v){ //操作函数v.toString=function(){ //方法修改参数toString()返回123;};} f(s);//传入值警报;//返回字符串‘ABC’,表示操作对原始数据没有影响(f(o);//传入引用预警;//返回值123,表示该操作影响了原始数据的内部结构。值类型以实际值参与运算,因此与原始数据没有直接关系。引用类型以引用地址参与操作,计算结果会影响与引用地址关联的堆数据块。但是,有一个例外,对于JavaScript字符串,它的操作方法比较复杂,详情请谷歌!

以上JavaScript数据操作_谈原值和参考值的操作本质是边肖分享的全部内容。希望能给大家一个参考,多支持我们。

版权声明:JavaScript数据运算_论原值与参考值的运算本质是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。