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