javascript跳躍式前進(1) - 基本概念
前言
javascript 是弱類型語言,比較接近python和perl這類,不如java和c那樣嚴格.所以寫慣了強型別語言的小夥伴看到有些另類的寫法也相當正常;
有些東東不精講..以後單獨脫離出來細講;
要點提取:文法區分大小寫[非常重要哦,比如True和False就不是布爾值了,而是標示符] 和強型別基本大同小異,以強型別的命名風格基本沒什麼錯誤;推薦駝峰大小寫 注釋有單行和多行注釋 strict 模式,速度運行是最快的;但是相當多的東西給限制了 語句以分號結尾,支援多變數定義[逗號隔開],在語句多的時候,鏈式寫法速度有一定的速度提升; 關鍵字和保留字不允許來做變數名[具體查表去吧..很多]資料類型
有這麼些資料類型: undefined(未定義) , Null(空值 – 特殊值) , Boolean(布爾值) , Number(數值) , String(字串) , Object(對象,這個範圍挺廣,Array也屬於其中)
undefined : 變數未初始化的預設值 null : 是一個特殊的對象[空的對象引用] boolean : 只有true和false兩個值,值得注意的是0和1不一定代表false和true Number : js沒有雙精確度.只有單精確度..也不像強型別語言,根據是否有小數點且跟值來定義浮點還是整數 , 數值溢出為infinity,[NaN是一個特殊的數值] String : 字串 Object : 函數就是對象..在JS中函數在沒有傳回值時預設返回的一個對象資料判斷
typeof , instanceof , hasOwnProperty, isPrototypeOf ,isArray
typeof : 會把大多類型歸為對象 instanceof : 用於判斷一個變數是否某個對象的執行個體 hasOwnProperty:是用來判斷一個對象是否有你給出名稱的屬性或對象。不過需要注意的是,此方法無法檢查該對象的原型鏈中是否具有該屬性,該屬性必須是對象本身的一個成員。 isPrototypeOf: 是用來判斷要檢查其原型鏈的對象是否存在於指定對象執行個體中,是則返回true,否則返回false。 isArray : ES5添加專門判斷是否為數組的資料轉換Number() : 可以把允許轉換成數值的內容變成數值,比如字串”123”[前置0會忽略],Null 字元串為0,除能轉為數字格式外的字元都會轉為NaN paseInt() : 轉換字串為整數,若是”111ee”只會得到111,逐個字元遍曆的[若是非數字開頭則不會遍曆,遇到小數點也會停止].. parseFloat() : 轉換字串為浮點數,與上面那個類似 Boolean() : 轉為布爾值 String() : 把值轉為字串,對象轉換會調用ValueOf(),與toString()效果基本一致操作符一元操作符 : 包括加減乘除,前置減減加加和後置減減加加[前置先賦值生效再執行,後置執行後再運算] 按位操作符 : 跟強型別語言一致,包括按位非(~)[值的反值,真假調換],按位與(&)[同為真才為真,其他為假],按位或(|)[存真即為真,同假才假],按位異或(^)[相同為假,不同為真] 左移和右移: 左移為乘以2的次冪,右移除以2的次冪..無符號右移[正數不變,符號會因為左邊填充0變成一個相當大的正值] 邏輯運算子 : 邏輯與(&&)[同為真才為真,其他為假] ,邏輯或(||)[有真即為真,同假才為假] 相等操作符 : = [賦值,有複合操作符(可以配合加減乘除求餘等運算子 ,例如 a %= 3 , b *= 2;)] , == [若允許轉換成比較的類型,自動轉換匹配的類型比較] , === [強等,不轉換比較,同時比較類型和值] 條件運算子[三目運算子] : (expression)? true : false ; 運算式真假來擷取對應的傳回值流量控制語句
流量控制語句,,大多程式設計語言都是大同小異~~~~
if語句
//推薦帶花括弧,且花括弧左邊緊貼運算式,可以降低文法解析識別為錯誤的問題[解析器會自動給一些變數或者語句添加分號]if(conditions) { ... }else if{ ...}else{ ...}
do-while語句
//先執行do裡面的邏輯,再執行判斷運算式來確定下一步是否執行 do{ statement; }while(expression)
while語句
//適合不知道應該迴圈多少次的,符合條件就無限執行,帶花括弧是一個好習慣 while(expression){ statement; }
for語句
//適合有限的迴圈 for(initialization ; expression ; post-loop-expression){ statement;}
for-in語句
//[ES5]適合來枚舉對象的屬性,遇到值為null或者undefined則會拋出錯誤 for(proerty in expression){ statement; }
forEach語句
//[ES5] 適合遍曆數組,缺點:不能用break跳出迴圈和用return語句 //傳統是用for來遍曆數組...見仁見智哈var arr = [1,2,3,4];arr.forEach(function(value){console.log(value)})//結果集: 1,2,3,4,undefined
for-of語句
//[ES6]這貨的出現,更加方便了數組的遍曆... //它避免了for-in的所有缺陷; //與forEach()不一樣,它支援break,continue和return。 var arr = [1,2,3,4]; for(var i of arr){ console.log(i) } //結果集: 1,2,3,4,undefined
label語句
//跟goto好類似....一般配合break和continue語句;在多重嵌套迴圈的時候,可以滿足條件直接跳出整個迴圈(標籤指定的位置) label : for(initialization ; expression ; post-loop-expression){ statement; }
break和continue語句
//break是跳出迴圈(中斷執行) //continue是跳出這次迴圈,進入下一次迴圈(只是跳過合格那一次迴圈,會繼續執行到結束)
switch語句
//文法和進階程式設計語言大同小異,適合多重判斷(當然不嫌棄麻煩可以用if..elseif...else) //小提示.若不是要執行多個運算式..記得每個對應判斷條件後必須break結束;否則會依次往下尋找對應的值,其上的所有非包含break的都會執行; switch(expression){ case value1 : statement; break; case value2 : statement; break; case value3 : statement; break; ... default:statement;break; }
函數
最簡單的聲明函數
/* 與大多程式設計語言一樣..函數執行到return語句就結束該函數了..不管後面還有木有運算式; 因為JS是弱類型語言.. 在ES6前,有些東西不得不類比,比如匿名函數,閉包,"花樣式"繼承 有點值得一提的是,,JS木有重載(當前,以後就不曉得會不會增加) 這裡不多說..到時候在新文章拖出來細細揣摩*/ function say(){ console.log("Hello world!"); } say(); function say1(args1,args2){ console.log("Hello world!"); } say1();
總結
就我個人而言..原生JS我是折騰的比較痛苦的…花樣太多;繼續磨練~