經過找工作筆試的洗禮,感覺自己js語法方面掌握的不是很系統,今天來梳理下——變量以及運算符。
基礎篇
和C語言的不同點:是一種弱類型語言,申明變量時不需要指定類型;變量名的命名方法也有不同;簡單類型種類也有不同;類型可以相互轉化
1.命名
是以字母,_,$開頭的,由數字,字母,下劃線 $組成的,不包括關鍵子,區分大小寫的串稱為標識符(加入了美元符號,不能以數字開頭啦)。
2. 申明
形式:var ?keyname; 可以多個一起申明,可以申明時初始化。
eg: var obj; var arr=[], objArr={};
注:(1)不需要申明類型,會根據程序的運行 自動轉換類型。(2)沒有定義就使用的,會報錯;申明了,沒有賦值的是undefinedd類型;(3)沒有使用var申明的是全局變量,關于全局變量下面會具體分析。
3.變量類型
簡單類型:boolean ?string ?number ?undefined null
注意點:
boolean:其值是true,false 也會轉換為 0,1 使用, Isload()==1;
string: 當個字符,或者字符串都是string類型;可以用單引號或者雙引號都可以var str='adafsd', str2="abc",其他同C語言;
number:表示 整數,小數;整數包括十進制,八進制(078),十六進制(ox78);數字常量:(Infinity 表示正無窮大 ?NaN 表示非數字)
null:是空類型,只有一個值null.表示沒有數據。
復雜類型:Array ?object
Array:是數組類型,可以用下標訪問,如:var ?t=[a,b,c];可以是復雜數組類型:var t=[{a=b},{a2=b}]
object: 對象類型,可以表示對象的 屬性 -值 ,鍵值對。可以嵌套任意類型。訪問用.進行訪問。
4.傳值和傳址
當變量時簡單類型時,是傳值的;如果變量時復雜變量時,是傳址的,及,傳遞的是原對象的引用(可以是指針,或者別名,指向的是原對象的的內存空間)。
5. 堆棧
簡單類型 存放在棧中,復雜類型存放在堆中,通過引用來操作;棧比堆快,棧可以共享,棧中的內容生存周期是和上下文相關,離開上下文就消亡。這里提到了共享.
eg: var a="abc"?;var b="abc";? 這時 a===b(true);因為 abc存放在棧中,可以共享。
?? var a=new string("abc"); var b="abc"; var c=new string("abc"); 這時 a!==b!==c;在堆中時運行是分配內存,不可以共享,并且堆中的東西和棧中更不相等。
順便 說下,內存管理。javascript中有內存管理機制,只要是沒有人再引用這個單元時,垃圾回收機制(GC)會自動收回內存。
垃圾回收:主要通過標記法和引用法兩種方式。標記法策略:當變量進入一個上下文就為變量標記為“進入環境”,離開上下文就標記為“離開環境”,垃圾回收機制為每個在內存中的變量都進行標記,他會為每個進入上下文的變量或者引用的變量進行清除標記,如果在這之后加上的標記就表示是準備刪除的數據。GC會回收內存,清除標記。引用法:記錄引用他的次數,不引用時減1.
內存泄露:雖然有內存管理機制(和java類似),但是也存在內存泄露的情況。比如閉包。
?
提升篇
主要總結 數據類型轉換,變量作用域,相關內容
?? 1.類型轉換
????分類:分為顯示轉換和隱式轉換
a 、顯示轉換
轉換為數字:Number(); parseInt(stirng,radix);parseFloat(string);
轉換為字符串:String(); toString();
轉換為布爾類型:Boolean(mix);
?
Number()規則
?Number(Null)===0;
Number(undefinde)=NaN;
Number("")===0;
Number(boolean)===0/1;
Number(string):當只包含數字時返回數字;當包含數字是float類型時,返回小數;空字符串返回為0;否則返回為NaN
b 、隱式轉換
1.遞增符號的轉換
????1.??當變量時字符串時,會根據Number()規則,轉換成數字,然后加++,--; 字符串中沒有數字轉換為NaN
????2.? 當變量時boolean時,會轉換為0,1 ,進行++ --操作,變量從boolean 變為數字型。
??? 3.Float 會自動+1;
?
?
?
?
總結:NaN,void,undefined,null ,以及常規的boolean-》0,1
NaN 運算符NaN(其他)結果為NaN(NaN是數字型,但是不是數字,每次都是計算機給分配的隨機值,NaN===NaN(false))
null==undefined(true)在類型轉換時unfinished=》null
null===undefined(false) 兩個是不同的類型,不相等
void(任意):void ?d ; 會將d的值清除 返回undefined,(void 返回undefined)
‘''=='0'(false)
"0"==0(true)
""==0(true)
?void(2)+4=NaN (void(2)=>undefined=》NaN+4=NaN)
?2. 作用域提升
變量必須要定義之后才能使用,但是在一個作用域中,如果先用,再定義也不會報錯,只是出來的結果會不是想象中的。這個就是變量作用域提升。
原理:函數調用時,會建立上下文,(1)聲明參數,并給參數賦值,(2)聲明函數并給函數符函數的引用(3)聲明變量,給變量賦值undefined(對于函數名和變量名重名的情況,會忽略變量的聲明,變量名依然指向函數的引用)
然后才會處理this的指向,最后調用執行;可見在執行之前會將函數內部的所有變量聲明,只是賦值為undefined,具體賦值要在執行期做。
所以類似 eg: alert(t); var t=30; alert(t); 輸出: undefined 30