Javascript中的值是通过值传递还是通过引用传递
在我们分析这个问题之前,我们需要知道什么叫值,什么是引用,在计算机科学中,这个部分叫做评价策略,它决定变量之间的值,函数调用和参数之间的值是如何传递的。
通过值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 =真正的价值是通过修改不影响目标。