js是一门弱类型语言,ECMAScript指出数据类型主要:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当咱们把变量赋值给一个变量时,解析器首先要作的就是确认这个值是基本类型值仍是引用类型值。javascript
在看具体分类以前须要明确:js只能操控栈,不能操控堆(是不是这么说?)。html
基本数据类型有如下几种:java
number,string,boolean,undefined,null 这五种json
基本数据类型能够直接操做保存在变量中的实际值,当变量自己发生变化时不对拷贝值形成影响。也就是直接在栈中操做。浏览器
如:spa
var a = 10; var b = a; //b是a的拷贝 a = 20; //变量a发生变化 console.log(b); //10
引用数据类型:——修改原始引用会对其余应用产生影响code
array,function,object。 这几种引用数据类型,实际上存在于堆中,栈中保留的只是堆中的引用。经过栈中的引用很容易找到堆中保留的原始数据。htm
如:对象
var obj = {name:"wuya"}; var obj2 = obj; obj.name = ""; console.log(obj2.name); //""
直接赋值的方式就是所谓的浅拷贝。blog
若是咱们想原始引用不影响拷贝,即所谓的深拷贝,就须要处理下。
实现一:
function clone(obj){ if(typeof obj != obj || obj == null){ //注意:typeof null == 'object' return obj; } var temp = obj.constructor(); for(var key in obj){ temp[key] = clone(obj[key]); } return temp; }
var obj = {name:"wuya"};
var obj2 = clone(obj);
obj.name = '';
console.log(obj2.name); //wuya
实现二:
var bob = { name: "Bob", age: 32 }; var bill = (JSON.parse(JSON.stringify(bob))); bill.name = "Bill"; console.log(bob); console.log(bill);
若是浏览器不支持JSON.stringify,引入json.org库就行
参考:
1.http://heyjavascript.com/4-creative-ways-to-clone-objects/
2.http://www.cnblogs.com/pigtail/archive/2012/06/29/2569601.html