Javascript中的值是通过值传递还是通过引用传递

Javascript中的值是通过值传递还是通过引用传递
最近有一个有趣的问题:js中的值是通过值还是引用传递的
在我们分析这个问题之前,我们需要知道什么叫值,什么是引用,在计算机科学中,这个部分叫做评价策略,它决定变量之间的值,函数调用和参数之间的值是如何传递的。
通过值VS传递值并传递引用。

按值调用是最常用的求值策略:函数的参数是调用时传递的真实参数的副本。修改参数的值不影响参数。
当引用传递(通过引用调用)时,函数的参数会收到对参数的隐式引用,而不再是一个拷贝。这意味着如果函数参数的值被修改,参数也将被修改。同时,两个点的值相同。
通过引用使函数调用的跟踪更加困难,有时会导致一些细微的错误。
由于需要每次复制一个副本,对于一些复杂类型的性能很低,这两种传输值的方式都有各自的问题。
让我们看一个C的例子来理解值和引用之间的区别。

复制代码代码如下所示:

无效修改(int p,int * q)

{

p=27;通过值p是参数的副本,只有p被修改。

* q = 27; q是对b的引用,q和b被修改。

}

主()

{

int = 1;

int = 1;

修改(a,b);通过a传递值,b通过引用传递,

a未改变,b更改

返回(0);

}
在这里我们可以看到:
p通过值,改变p的参数值不影响参数a,p只是a的副本。

q是通过引用传递的,修改参数Q值也会影响B参数的值。

JS价值转移模式探讨

js的基本类型是按值传递的。

复制代码代码如下所示:

var a=1;

函数(x){

x=2;

}

富(A);

console.log(一); / / 1,x = 2是不是由分配的影响
再看一遍对象:

复制代码代码如下所示:

var obj = { x:1 };

函数富(o){

OX = 3;

}

foo(obj);

console.log(obj,x); / / 3,修订!
它表明,O和obj是相同的对象,而不是一个复制的对象。所以它不是值传递。但这并不表明JS对象是通过引用传递的吗让我们看下面的例子。

复制代码代码如下所示:

var obj = { x:1 };

函数富(o){

o=100;

}

foo(obj);

console.log(obj,x); / /仍然是1,目标没有改变100。
如果是通过引用传递的参数,这个值应该被修改,而应该是受到影响。但修改啊,这里的值不影响对象。所以在JS对象是通过引用传递。因此该对象的值是通过JS
通过共享来传递呼叫

准确地说,在JS的基本类型是按值传递的,而对象的类型是通过共享(呼叫通过分享,通过对象,也被对象共享)。它首先是由Barbara Liskov提出的。在1974葡萄糖的语言。评价策略是用于诸如Python、java、露比多种语言,js等。
这一战略的关键是,当调用函数传递引用,该函数接受一份来自对象参考参考,不是复制对象的值传递,也不是一个隐式引用的引用传递。它不同于参考参考:函数的参数传递的共享的值不会影响这个参数的值,如下面的例子,该对象的值不能通过修改参数的值修正O.

复制代码代码如下所示:

var obj = { x:1 };

函数(o){

o=100;

}

foo(obj);

console.log(obj,x); / /仍然是1,目标没有改变100。
然而,尽管引用是副本,引用的对象是相同的,它们共享同一个对象,因此修改参数对象的属性值也会影响参数的属性值。

复制代码代码如下所示:

var obj = { x:1 };

函数富(o){

OX = 3;

}

foo(obj);

console.log(obj,x); / / 3,修订!
一个对象类型作为对象是可变的(mutable),修改对象本身影响借鉴和参考的共享对象的副本。对于基本类型,因为它们都是不可变的(不变的),是没有区别的共享传递和调用之间的价值,所以JS的基本类型,不仅适用于输送的价值,也为共享传递。

复制代码代码如下所示:

var a = 1; 1是数字类型,而不是B变量var = a;b = 6;
根据共享交付策略,a和b是两个不同的引用(b是a的参考副本),但引用相同的值。因为基本类型编号1在这里是不可变的,所以说值传递和共享没有区别。
基本类型的不可变属性

基本类型是不可变的(不可变的),只有对象是可变的(可变的)。例如,数值为100,布尔值为true,false,修改这些值(例如,1至3转,把真实的100)没有多大意义。什么是容易误解是串在JS。有时我们试图改变字符串的内容,但在JS,任何修饰,似乎是一个字符串值实际上是创建一个新字符串值。

复制代码代码如下所示:

var;

0;}

STR 0 } = d;

仍然是赋值无效。无法修改字符串的内容。
对象是不同的,对象是可变的。

复制代码代码如下所示:

var obj = { x:1 };

obj。x = 100;

var o = obj;

OX = 1;

对象X; / / 1,改性

O =真;

对象X; / / 1,O =真的不会改变
可变对象定义在这里,值对象,和对象的值。X属性设置为100,然后我们定义一个变量,这仍然是对象。当时,对OBJ和O点两变量的值相同的对象(同一个对象的引用),所以修改对象的内容对OBJ和O.但对象不是通过引用传递的影响,和O O =真正的价值是通过修改不影响目标。

tag:引用传递值传递电脑软件Javascript

相关内容