05 March 2013

JS之传递对象

今天碰到一个小问题,卡了我好一会,查了下资料,发现一个以前没注意到的地方!问题如下:

var a = {'a':'b'}
var b= a;
delete(b['a'])
console.log(a);// 输出{}!

这当然不是我想要的结果,查阅了资料,发现了这么一个很基础的东东:

JS中分为两种类型:

  1. 基本类型(包括undefined,Null,boolean,String,Number),按值传递;
  2. 引用类型(包括数组,对象–当然了数组本身就是对象),按址传递,引用类型在值传递的时候是内存中的地址;

SO,看到了,引用类型,包括数组,对象,传递的时候传的是地址!

那么赋a给b后,操作b当然会改变a了。

故,如果想操作b而不改变a,那么我们需要深刻克隆,我在网上找到最巧妙的办法如下:

var s = JSON.stringify( obj ); 
var o = JSON.parse( s );

好了,总结一下:

对象赋值的时候记得是传递内存地址,如果需要深度克隆,使用 JSON.stringify+JSON.parse

Posted in 2013-03-05 12:15