原文出處http://mp.weixin.qq.com/s/apFyUgqT5N-bsDUjP4Eryg 首先記住js中的基礎數據類型undefined,null,boolean,string,number 1基本數據類型一基本數據類型的值是不可變的var name = 'hello';name.s ...
原文參考http://mp.weixin.qq.com/s/apFyUgqT5N-bsDUjP4Eryg
筆記總結
首先記住js中的基礎數據類型
undefined,null,boolean,string,number
1基本數據類型
一基本數據類型的值是不可變的
var name = 'hello';
name.substr(2);// 此處sunstr方法返回新的字元串
console.log(name);// ‘hello’
var name = 'hello2';
name = 'world'
console.log(name);// 輸出'world',可以理解現在棧中新有一塊地址存儲的是world,但是它的標識符是name,現在name代表的是world了。
二基本數據類型不可以添加屬性和方法
三基本數據類型是簡單賦值
var a = 10;
var b = a;// 這裡理解是把10給了b
b = 15;
console.log(a);// 10
console.log(b);// 15
a和b有各自的存儲空間
四基本數據類型是值比較
var a = '{}';
var b = '{}';
console.log(a == b);// 這裡是字元串的比較,所以返回是true
五基本數據類型存放在棧中。
棧里存放的是一個字典
左側是Key(變數名)右側是value(真正的值)
2引用類型
一值是可以改變的
var o = {x:1};
o.x = 2;// console.log(o.x)已經變為2
二可以添加屬性和方法
var obj = {};
obj.name='zs';
obj.getName=function(){console.log(obj.name)}
三引用類型賦值的是對象引用
var a = {};
var b = a;// b在棧中新建了一個地址,指向了a在堆中存儲的數據
a.name = 'change';// a的更改會影響b的數值
console.log(a.name);// change
console.log(b.name);// change
四引用類型比較的是引用地址
var a = {};
var b = {};
console.log(a == b);// 在記憶體中地址是動態分配的,這裡返回false
五引用類型數據會保存在棧和堆中
var a = {name:'zs'}
棧中保存的是a和一個分配的地址
堆中保存的是{name:'zs'}
基本包裝類型即Number,Boolean,String(首字母大寫,現在看成是一個類型)
js本身自帶的。
var str1 = 'hello';
實際在js內部執行了下麵操作:
var str1 = new String('hello');
var str2 = str1.substr(2);
str1 = null;// 這裡就釋放了str1與值得關聯,在垃圾收集器回收時候,自動回收。因為自動執行了這一步所以基本數據類型無法添加屬性和方法。只有基本包裝類型才會有這一步。