js 对象的值传递

一、变量赋值的不同

1、原始值

在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的。

 

2、引用值:

在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,

也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。

 

 

二、参数传递的不同

首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。但是为什么涉及到原始类型与引用类型的值时仍然有区别呢,就是因为内存分配时的差别。

  • 原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
  • 引用值:对象变量它里面的值是这个对象在堆内存中的内存地址!因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了。


三、对象的值传递

  • 改变对象内存地址:如果参数赋值另一个对象时,这个参数就会更改它的值为新对象的内存地址指向新的对象,此时与原对象相互独立;
  • 改变对象的内部属性:如果这个参数是改变对象内部的属性的话,这个改变会体现在外部,因为他们共同指向的这个对象被修改了!
var obj1 = {value:'111'};
var obj2 = {value:'222'};
function changeStuff(obj){
  // 实际上这里简写一步obj = obj1;而不是将obj直接看成obj1
  obj.value = '333';    //
  obj = obj2;    //
  return obj.value;
}
var foo = changeStuff(obj1);
console.log(foo);   // '222' 参数obj指向了新的对象                                     
console.log(obj1.value);  // '333' 

解析:

①将obj1的对象地址复制给obj,这样,obj和obj1共同指向一个对象地址!

同时改变obj的value属性(obj.value=333),obj1的value值也随着改变(obj1.value=333)!

②将obj2的对象地址复制给obj,obj指向obj2的对象地址。obj.value=222)

原文地址:https://www.cnblogs.com/minigrasshopper/p/8056816.html