JS引用传递与值传递的区别

JavaScript019

JS引用传递与值传递的区别,第1张

这两者的本质区别是:传递的数据类型不一样,值传递的是一个数值,而引用传递传递的是一个对象。

这个很明显会报错,因为没有创建变量a

这个结果 a 为 6 ,因为并没有调用函数 fn 所以函数找不到a ,a++ 并没有执行;

这个结果 a 为 6, 因为这个fn 执行后把 参数6传给了 函数里边的 a ,在函数内部开辟了一个空间 a = 6 ,然后经过a++; a 为 7 ,  但结果并不会改变函数外面的 a 的值 ,所以结果还是 为6 .

在函数调用中,传递数值,我们成为“值传递”,

值传递特点:因为值传递的数据,地址和值是一个内容,所以在拷贝之后,改变新的,不会影响老的。

这个结果为7,因为这个fn执行后把参数6 传给了函数 fn 但是函数fn 里并没有接受这个参数的 形参,  这是函数内部并没有 a 的空间 ,所以会自动向外面搜索 找到a 的值 这时 是对外部 a 的修改,所以会改变 a 的值。

引用传递的特点:因为引用传递的数据,地址和值是两部分内容,所以在默认拷贝之后,仅仅拷贝了地址,没有拷贝值,此时两个地址指向了同一个值,那么就会造成修改新的,会影响老的,因为只有一个值。

JS求值策略有诸多争议和不同版本。对于这个问题的答案:“JS中基本类型是按值传递的,对象类型是按共享传递的。”共享传递解释为:(callbysharing,也叫按对象传递、按对象共享传递)。最早由BarbaraLiskov.在1974年的GLU语言中提出。该求值策略被用于Python、Java、Ruby、JS等多种语言。你可以自己写个demo运行下结果就知道。var a = 1function foo(x) {x = 2}foo(a)console.log(a)// 仍为1, 未受x = 2赋值所影响var obj = {x : 1}function foo(o) {o.x = 3}foo(obj)console.log(obj.x)// 3, 被修改了!