最近在看jquery源碼,發(fā)現(xiàn)自己的js基礎(chǔ)真不是一般的弱!B站洹角溃!這不,趕緊來惡補了喳钟!
一屁使、基本類型
也稱值類型,包括字符串(string)荚藻、數(shù)字(number)屋灌、布爾(boolean)、Null应狱、Undefined共郭、Symbol(ES6新增,類似于string的數(shù)據(jù)類型疾呻,表示獨一無二,詳情見MDN-Symbol)六種基本類型除嘹。
特點:
1. 指向的內(nèi)存空間不會變
2. 按值訪問,可以操作變量實際值
3. 存放在棧區(qū)(棧區(qū)指內(nèi)存里的棧內(nèi)存)岸蜗,包括變量的標(biāo)識符和變量的值尉咕。
復(fù)制的例子:
var a=3;
var b=a;
console.log(a);//3
b=5;
console.log(a);//3
console.log(b);//5
顯然,a 不會隨b的改變而改變璃岳。值類型就像陌生人一樣年缎,雖然都是人,但我有我的特色铃慷,你有你的愛好单芜,各自都沒有影響。
二犁柜、引用類型(敲黑板洲鸠、重點)
數(shù)組(array)、對象(object)、函數(shù)(function)
PS:其實也可以直接說object一種扒腕,畢竟一切皆對象嘛绢淀,哈哈
特點:
- 在計算機中占用內(nèi)存可變
- 訪問是按引用訪問。當(dāng)查詢時瘾腰,我們需要先從棧中讀取內(nèi)存地址皆的,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值
- 值保存在內(nèi)存中,而JS是不能直接訪問內(nèi)存的蹋盆,所以對于引用類型祭务,操作的不是實際的對象而是對象的引用。
復(fù)制的例子:
var obj1={
"name":'jack',
"lesson":{
"Chinese":'110',
"Mathematics":"135"
}
}
var obj2=obj1.lesson;
obj1.lesson.English="90";
console.log(obj1.lesson.English);//90
console.log(obj2.English);//90
obj2屬性和值隨著obj1的改變而改變怪嫌!
調(diào)換下順序义锥,改變obj2屬性,不改變obj1,看下結(jié)果:
var obj1={
"name":'jack',
"lesson":{
"Chinese":'110',
"Mathematics":"135"
}
}
var obj2=obj1.lesson;
obj2.English="90";
console.log(obj2.English);//90
console.log(obj1.lesson.English);//90
obj1屬性和值隨著obj2的改變而改變岩灭!
引用類型的復(fù)制實際上是共用一個指針拌倍,而這個指針指向存儲在堆中的一個對象。兩個變量實際上引用的是同一個對象噪径。
這種感覺就像夫妻一樣柱恤,你影響著我,我影響著你找爱。
所以這種復(fù)制也叫淺拷貝啦梗顺。什么?什么叫深拷貝车摄?看官先自行思考熟悉下寺谤,待我下回分解 O(∩_∩)O
比較的例子:
var a = new Number(1);
var b = new Number(1);
var c = a; // 把a的引用賦值給c
console.log(a==b); // false
console.log(a==c); // true
a和b分別new了個Number 對象,指向不同對象的引用,因此a!=b吮播;而c=a变屁,即a和c的引用地址是一樣的,所以a==c意狠。
不難看出粟关,js中對象的比較實際是內(nèi)存地址的比較
傳遞的例子:
var a = [1,2,3];
function f(x){
x[0] = 4; // 在函數(shù)中修改參數(shù)值
}
f(a);
console.log(a[0]);
a作為參數(shù)傳遞的也是引用,最后a的值為[4,2,3]
最后环戈,一個備受爭議的例子:
function setName(obj){
obj.name="ted";
obj=new Object();//個人覺得這明明就是作用域問題,局部變量沒有return,執(zhí)行完就銷毀了
obj.name="marry";
}
var obj=new Object();
setName(obj);
console.log(obj.name);
個人覺得就是作用域問題闷板,不知道爭論的點和引用傳遞有什么關(guān)系。院塞。遮晚。
最后
引用類型或許單獨看著很簡單,但是如果在復(fù)雜的應(yīng)用中(尤其是上下文依賴比較嚴重的地方)還是能一眼看穿迫悠,那就是真大神了吧E羝帷(努力ing)