【android免root腳本製作】auto.js語法的認識和應用

        經過基礎篇收金果的小小實踐,我們對腳本有了粗略的認識,相信也產生了些進一步學習乃至掌握的興趣,畢竟生活中很多時候也許就用上啦!遠的不說就比如昨天618的搶券啊,公司上下班小程序打卡啊,諸如此類……接下來就針對語法逐步學習,爲了方便非IT專業人士的理解學習,所以儘量的大白話講述。

一、變量的使用

變量顧名思義,就是一個可以改變的量。說的簡單點,可以理解爲,字母表示值,但是這個值有很多種,不一定是數字,小數,還有很多其他類型,比如說字符,字符串,再大點,各種對象,手機電腦,都可以保存在一個變量裏,但是各種對象的數據類型,可能包含着很多內容,並且還有函數。

1.變量的創建    -   var        

var創建變量,是js語言中最簡單的創建方法。語法是:

var 變量名; 

比如我們要創建一個名字爲a的變量,語句就是var a;這時就創建出來一個空的變量,如果輸出他的值,那就是null(空),也可以在創建的同時給變量寫上初始值,語法是:

var 變量名=值;

比如我們創建一個值爲5,名字叫b的變量,語句就是var b=5;使用這句話之後,系統會創建一個叫b的變量並且給他賦值,值爲5,這個變量數據類型就是數字(Number)類型。

關於變量名,也有一定要求,主要就是不能以數字開頭,變量名不可重複,不能和運行關鍵詞while,for,if,try等等的關鍵字相同。中文變量名在js是可以用,但是不推薦使用。        

拓展:在創建的時候,還有另一種情況我們需要先創建一個變量,但是在這時,我們還不知道這個變量的數值或者我們要定義的這個變量根本沒有數值,但一定要規定數據類型。這時我們要用到構造函數,這是很多類裏面都有的功能,創建的語法是:

var 變量名=new 數據類型(傳入值);   

我們先不說自己寫的類,如何寫構造函數,先看看怎麼使用別人類的構造函數,比如說我們要創建一個數據類型爲數組的變量(數組就是一個序列,裏面能放很多相同數據類型的變量),但不知道里面的內容,這時候就可以用數組的構造函數new Array();比如語句是var d=new Array();這時就創建了一個數據類型爲數組的變量。

這時細心的朋友應該發現了,上面的語法裏括號裏明明寫需要寫上傳入值的爲什麼這邊語句裏傳入值是空的呢?這種構造函數,在創建時候不需要傳入任何值,被叫做無參構造函數,與之相對的,還有有參構造函數,比如這個數組,其實有兩種構造函數,還有一種是需要傳入創建出來的數組的長度的,比如我要創建一個長度(整數類型)爲5的數組(數組裏面能放5個變量)名字叫e的數組,語句是var e=new Array(5);  當一個類有多個無參構造函數時,在創建的時候系統會根據你傳入的值的個數和類型選擇對應的構造函數。

2.基本數據類型        

雖然數據類型有很多,每個人都能自己寫數據類型。但是基本數據類型實際上不多,主要有 數字型(Number),布爾型(Boolean),字符串型(String),其他還有 不明(Undefined),空(null)等。Number不用我多說 就是數字,布爾型就是對與否。true和false只有兩個值,字符串就是我們說的文字abc之類的,但是表示字符串的時候必須要注意用英文輸入法的雙引號套住,比如要創建一個值爲abc的字符串變量,語句是var f="abc";但如果你寫成了var f=abc;這時,系統運行到這部時就會去尋找名字叫做abc的變量,沒有找到就會拋出變量未找到的報錯信息,導致腳本停止。

3.變量賦值 ——     賦值運算符 =

變量的值,是可變的那麼如何修改變量的值呢,這就要用到賦值運算符-等於號。這個符號的作用就是把等號前的變量的值設置爲等號後的值,比如按順序三行代碼

var a=5;
a=0;
log(a);

這時打印變量,輸出的信息是0,雖然原來創建了值爲5的變量,但後來將變量的值修改成0了,所以最終輸出出來還是0。

4.變量間的運算

①字符串,字符串的拼接用加號進行運算

用變量也是一樣的。

數字間加減乘除運算,乘號用*,除號用/

③布爾值運算         

非-感嘆號,感嘆號的作用是布爾值取反,比如本來爲true的數據類型,用了!值爲false,本來爲false的變爲true。        

 與-    &&,連接兩個布爾值,如果兩個值都爲true,那麼返回true,否則返回false         

任意-    ||,連接兩個布爾值,如果兩個中有一個爲true,那麼整體返回true,否則返回false     舉個例子:

以上都是關於返回相同數據類型之間的計算,還有返回不同數據類型間的,比如兩個數字相同則返回true不同返回false,就是返回不同數據類型間的計算,關係運算符。    

①判斷是否相等,所有數據類型都可以使用        

雙等於號==,判斷兩個變量是否相同,連接兩個變量,如果左右兩個變量完全相同,則整體返回true,不同返回false。        

感嘆號等於號!=,判斷兩個變量是否不同,連接兩個變量,如果左右兩個變量,不同,返回true,相同則返回false。     

舉個例子:

②判斷數字大小,只用於連接兩個數字,返回布爾值         大於:>    小於:<    大於等於:>=    小於等於:<=
 

5.信息輸出

便於調試測試結果,一般我們打日誌查看,特別是異常情況時。在Auto.js中信息輸出有很多方式, 比如console.log();這個功能,在Auto.js中封裝成了全局函數,所以可以直接用語法:

log(要輸出的內容);

這是最常見的一種輸出方式,打印黑字到日誌,一般用來輸出運行的普通信息。可以是任何類型的,但終究是用文字的形式表示出來。 日誌打開方法:腳本編輯界面->右上角三個點->日誌 我們來測試一下代碼log("大富翁");的打印信息吧

                                                            

點擊運行,然後點擊右上角三個點->日誌:

                                                            

日誌裏的輸出功能還有很多:

console.verbose("要輸出的內容");顏色爲灰色,一般用來打印不重要內容。

console.info("要輸出的內容");顏色爲綠色,一般用來打印運行信息。

console.warn("要輸出的內容");顏色爲藍色,一般用來打印運行警報。

console.error("要輸出的內容");顏色爲紅色,一般用來打印運行報錯信息。

除了在日誌裏打印輸出,當然還有其他方法。

氣泡輸出:語法:

toast("要輸出內容");

對話框輸出:語法:

alert("標題","內容");

6.代碼註釋

要是程序寫長了,不要說別人,自己看,過久了都很難看懂,這時就需要在代碼上標註註釋,註釋寫詳細,是寫程序的一種好習慣。系統運行代碼時碰到註釋會自動跳過,註釋只是給寫代碼的人看的。那麼如何寫註釋呢。     

行級註釋 :

// 註釋內容

行級註釋,從雙斜槓開始這一行後面的,全爲註釋。    

塊級註釋:

/*註釋內容*/

跨行註釋,從斜槓星號一直到星號斜槓中的內容,無論多少行,都判斷爲註釋內容。

因爲過於簡單,讀者自己寫個範例實踐下就好。

 

二、判斷語句的使用

1.基本if語句        

這裏方法要用到if語句,基本就是

if(判斷內容){運行的代碼塊}

一般用大括號括起來的內容,叫做一個代碼塊,用於放代碼。判斷內容是否符合,裏面肯定是一個布爾值,如果true則運行後方的代碼,false則不運行。舉個例子:

2.if else語句        

我們需要判斷一個內容如果是則運行一向內容,如果不是,運行另一向內容。這個時候就要用到if else語句。語法:

if(判斷內容){true的運行代碼}else{false的運行代碼}

非常簡單,就和下一個的例子一起看吧。

3.if-else if-else語句        

語法:

if(第一個判斷內容){第一個執行代碼}else if(第二個判斷內容){第二個執行代碼}esle{其他情況的執行代碼}

運行時系統會判斷第一個內容,對就執行第一個執行代碼,然後結束整個if循環,不對則繼續判斷後面的else if後的判斷內容,還是對就執行第二個,不對繼續往下,以上都不對,就運行else。在第一個if和最後一個else中間的else if可以無限加,只要判斷對就執行對應的執行語句,並結束整個else語句,如果不對就繼續往下,一直到else。舉個例子

4.switch語句        

判斷一個變量,是否等於下面的值,是則運行對應的代碼。語法:

舉個例子:

三、循環運行的使用

腳本中通過循環可以大大減少代碼,還可以完成很多本來做不到的事情。這個功能是寫腳本必須學會的。循環分爲好多種,比較常見的有while,for循環等。下面我們就來挨個介紹吧。

1.while循環        

while循環是最基本的一種循環用法,也是最簡單的。語法是

while(判斷內容){運行內容}   

運行內容在循環中,也叫循環體。判斷內容如果成立,就運行循環體的內容。判斷內容是布爾值,比如while(true){循環體}這樣就會無限運行循環體裏的內容,因爲判斷內容一直爲true沒有變過。        

比如寫個示例,我要循環打印字母a到日誌,那麼代碼爲

while(true){
    log("a");
}

運行後就可以看到日誌內在瘋狂的打印出字母a了。如果不想運行這麼快,可以在每次log之後加一個sleep進行延時,比如

while(true){
    log("a");
    sleep(1000);
}

這樣就每秒打印一次a字母了。        

只是限定死循環,再實際中完全沒有作用因爲這樣就直接進入循環運行後,下面的代碼完全運行不到了。我們現在一起想,如何做出循環限定次數,我們想想要達到定量循環,那就是,達到第幾遍運行時,要讓判斷內容不成立,這樣運行到那一遍時,就運行終止了。那我們可以設置一個變量,每循環一次都增加1,然後判斷是否到那和值。這個代碼的具體實現方法如下:

每次運行,第七行會把i的值修改成比i大1的值,也可以用i++來直接代替該功能。當運行到第9遍時,變量i從9變到10,然後判斷出10並不小於10,所以停止這次循環。另注:這一個循環裏面內容共循環10次,i分別從0到9。但是每次做定量循環如此常用的功能都要這麼寫非常麻煩,所以就有了一種新功能for循環,詳情請看下面的內容。

2.for循環的基本使用        

 for循環幾乎可以說是爲定量循環功能量身定做的一個功能。基本語法爲

for(語句1;判斷內容;語句2){循環體}   

這個語句在運行的時候系統會先運行語句1,注意,語句1只運行這一遍,不會循環,然後判斷內容如果爲true,就運行循環體,循環體運行完後,運行語句2,語句2運行完後就,會到判斷如果爲true,繼續進行循環。        

直接說可能有點抽象,我們舉個例子理解這個功能

查看日誌結果:

3.循環語句的默認值        

for循環和while不一樣,他另一個方便的地方在於他有默認值。如果while裏面判斷內容不寫肯定會報錯,而for不會。for循環語句第一個如果空着,默認不執行,第二個不輸入,默認爲true,即無限循環,第三個空着也默認不執行。所以for(;;){循環體內容}也可以做無限循環使用。雖然可以省略語句內容,但是for循環後面括號裏的兩個分號,必須不能省略,不然也會報錯

4.break和continue對循環操作的使用         

在循環中,還有另一個重要的功能就是break和continue,有了這兩個功能後,循環將會更加方便,和實用。        

break的作用是終止整個循環,運行了這段代碼直接停止整個循環,然後當然就去運行之後的內容了。比如,我們還可以用另一個方法做定量循環:

大家可以運行後查看日誌看看輸出結果。當判斷循環變量加到10後就運行if語句裏的break,停止循環,不是10當然就不運行。當然,運行了break之後,就算當前那次循環,在break後面的語句也不會運行了。

continue的作用是結束本次循環,進入下次循環,運行了這個代碼後,當前循環continue後面的代碼內容都不會運行,直接進入下一次循環。我們直接來看示例:

我們通過示例結果輸出可以看到,他只打印了continue前,爲什麼沒有打印continue後的內容呢。他開始循環,運行打印continue前,然後運行到了continue,這時,進入了下一次循環,並沒有運行到後面的內容,所以又運行了輸出continue前,然後再進入下一次循環,等待。看了這個示例,應該能理解用法咯。

5.循環內變量的生命週期        

在循環內也可以創建變量,但是我們要是循環運行創建變量,會不會因爲設置的名字相同的變量,導致報錯呢,答案是不會的,因爲在循環中創建的變量,當這次循環結束,系統會自動銷燬這個變量。當然,因爲自動銷燬,下一次循環也沒法調用上次循環裏創建的變量。而在循環結束後,也沒有辦法獲取循環中的變量。那我們,如果要在循環外獲取到循環內處理的變量怎麼辦呢,那只有在循環前創建之後要獲取的變量,這一個辦法。使用循環前,要記得根據需求,提前設置變量咯。ps:for循環中的語句1中創建的變量是在循環前運行的,所以可以在循環後直接調用。

6.do while循環        

這個循環,是比較少用的一個循環,他的語法是:

do{循環體}while(判斷內容);   

他的用法和while差不多,區別就是,他會先運行循環體內容,然後再判斷內容,看看要不要繼續循環運行循環體。那他和while循環的區別在哪呢。那就是,就算判斷內容一開始就爲false,他也會先運行一次循環體語句。循環體語句至少會運行一次。

7.setInterval循環         

這個循環的功能是定時循環,也就是每運行一次循環體,會等待一段時間。他的語法是

setInterval(function(){循環體},延時);   

循環體內容,也不用多說了。這個循環的問題在於,他並沒有判斷內容,也就是說,要停止這個循環只能用上面提到的break功能,後面輸入的延時,是每次循環體內容運行後,等待的時間,單位是毫秒,所有程序裏的時間,單位一般都是毫秒。這個功能一般比較少用,主要用處在於ui線程上的循環處理,在ui中,以上的功能,只能在新線程中運行。

 

四、數組的使用

數組。這也是到以後代碼裏必不可少的一部分。他的作用是同樣數據類型的對象放到一個集合中,一個變量中,還可以通過下標來獲取這個集合指定位置的內容。但是和他名字不同的是,在數組裏放的內容不只是數,而是所有內容都可以,包括布爾值,字符串,各種對象,甚至還可以在數組裏放數組(也就是高維數組)等等,這就是數組。

下面讓我們來具體瞭解一下數組的用法吧。

1.數組的表示        

數組在程序中,用中括號表示,裏面的內容用英文的逗號“,”進行分割,比如放了三個數字一到三的數組,就是[1,2,3]    這個應該很好理解,如果放了三個字符串a b c那就是["a","b","c"],ps:字符串記得加引號。

2.數組的創建         

要創建一個數組,當然可以通過直接輸入初始值來創建,比如var arr=[1,2,3];    這是最基本的創建方法,那我們要創建一個空數組怎麼辦呢,這時要用到構造函數。就是var arr=new Array(長度);    這樣可以直接創建一個指定長度的空數組,比如要創建一個長度爲5的空數組:var arr=new Array(5);  還有一個構造函數,可以傳入多個內容比如var arr=new Array(5,6,7,8);  這時創建出來的數組就會自動判斷數據類型(js本生就是泛型)根據傳入內容的數量創建,對應長度和類型的數組。打印以上例子的結果是[5,6,7,8];

3.數組的長度         

數組的長度就是數組內內容的個數,比如 [1,3,5,7,9] 這個數組,長度爲5 , ['a','b','c'] 的長度爲3。可以用數組的length屬性獲得的長度,var arr=[1,2,3];log(arr.length);這就是一個輸出arr數組長度的例子,結果當然爲3。

4.數組的下標        

數組的下標是獲取數組中指定內容的索引,數組中的每個內容,都有一個下標,按照順序,從0開始,[1,2,3] 這個數組的三個內容的下標分別是0,1,2。

5.數組長度與下標的關係      

  在用數組的時候有個易錯點,那就是很多人會認爲最後一個內容的下標,就是數組的長度。然而下標是從0開始計數,而長度是從1開始數的。具體算下來,數組最後一個內容的下標就是數組長度-1

6.數組獲取指定位置的內容      

  那我們如何獲取並查看修改數組內的值呢,語法是:

變量名[下標]   

就這麼簡單,但是要注意的是,下標是從0開始的,舉個例子:

 var arr=[2,3,4,5]; 

//輸出下標爲2的內容,即第三個
 log(arr(2)); 
//輸出信息4 

arr[0]=6; 
log(arr); 
//輸出信息[6,3,4,5]; 

我們用這個方法獲得到了數組裏的內容後,可以直接輸出,賦值給變量或是直接修改。

7.push放入內容        

push是數組的一個方法,用來朝數組內添加元素。語法是:

數組.push(放入內容);   

運行時,會先把數組最後增加一格長度,並且賦值成括號內的放入內容。非常簡單,就不給例子了。

8.pop和shift刪除首位        

pop和shift兩個數組的方法,分別可以用來刪除數組的最後一位和第一位,同時會返回刪掉的內容。比如原來一個數組arr的值是[1,2,3,4],這時運行一下arr.pop();他就成[1,2,3],這時再運行arr.shift();  他的值就變成了[2,3]  用法也很簡單,自己嘗試吧,一般返回值的用處並不是很大。

9.split字符串分割至數組      

  我們可以通過別的類中的一些函數或者數組類中的函數,可以把數組和其他類中互相轉換。比如說split就可以把字符串轉換到數組,split的主要作用就是把數組通過制定字符切割成多個字符串放入一個字符串數組。比如說一個字符串

var str="abcdabcdabcd";

然後用split處理,我們用一個新的變量,

var arr=str.split("c");

那麼分割出來的字符串就是ab,dab,dab,d。

如果打印輸出這個數那麼打印出來的內容爲["ab","dab","dab","d"]

10.循環遍歷數組        

我們可以用循環來對數組裏的每一個內容進行操作,我們直接用一個例子來說明這個功能吧,假如我們需要對一個數字數組的每一位的值增加一,那麼我們看下面那個例子。

從大體上來看這個例子,我們可以發現在每一次的循環中,都通過下標獲取到了數組的某一個內容,並用我們之前講過的雙加號的方法把他的值擴大到比原來大一的值。再仔細看,每次獲取的下標的大小,從第一次循環,i的初始值爲0,那麼數組下標爲0的那一個也就是第一個,一直每次循環i++獲取下標更大一的內容,一直到最後一個,之前講過在for循環中,每次循環會判斷第二格的內容是否成立,在運行下面的內容

11.高維數組        

高維數組就是數組中嵌套數組,比如說 var arr=[[1,2,3],[4,5,6],[7,8,9]]; 這就是一個數組存放了三個數字數組在裏面。那我們要獲取輸出第二個數組中的第三個值的代碼就爲log(arr[1][2]);         

高維數組在多重嵌套for循環做處理常用,這裏只是略講,不過也沒有什麼特別的功能,很容易看懂。

 

五、面向函數式編程

什麼是函數?我們也可以叫他方法,就是可以把一些常用的代碼塊,放到一起,然後在不同的地方都要用到的時候就可以直接調用它。這樣就可以省去很多重複的代碼,理論角度就可以做到沒有重複的代碼塊。

1.創建並且調用函數:function關鍵字

我們知道創建變量的其中一個關鍵字是var,創建函數同樣是有關鍵字的,只有一個就是function,格式代碼如下:

function 代碼名(){     代碼塊內容; }

其實很簡單,比如我們要創建一個叫log123的函數,用來按順序輸出1,2,3三個數字,也就是log(1);log(2);log(3)每次打三個麻煩,於是寫一個函數可以,每次調用都按順序輸出123,代碼如下:

function log123(){

    log(1);

    log(2);

    log(3);

}

也就這麼簡單,當我們需要調用他的時候,就直接運行log123()就行了,比如 log123(); log123(); 這樣子就等於調用了兩遍,輸出的內容應該就爲:

1 2 3 1 2 3

當然如果我們不調用函數,只創建,運行這個腳本什麼也不會發生的。還有另一種函數的創建方法,和變量有點類似。代碼格式如下:

var 函數名 = function(){代碼塊內容;}

其實用法一樣,同樣舉個上面的例子:var log123 = function(){log(1);log(2);log(3)}

/* 我們這邊來講一下上面那兩種創建方法的區別,看似作用一樣,其實還是有區別的,等編程到達一定境界,並且開始追求程序效率了,那就應該要知道咯。        

我們首先要知道程序是如何運行的,其實我用簡單一點的話來說就是:會有解析器(等引擎)把js文件轉換成機器語言(即0和1,也是設備唯一看得懂的語言),然後再讓設備運行。        

這個過程中,這兩種函數就會有不同的解析方式。解析器在解析的時候會先把所有函數給解析出來,也就是說,一開始解析,就會把所有第一種方式建的函數全解析出來。        

所以這兩種的區別也就在程序運行的加載差別上。在面向對象編程中還會有其他問題,但正常使用中,只有非常追求性能的人可能才需要用得上。*/

2.函數返回值:return關鍵字         

函數可以只有運行內容,但是我們也可以讓他有返回內容。比如說在我們需要獲取到函數運行的結果,或者快速停止函數的時候,我們都會用到return來返回。         return的主要作用就是,停止這個函數的運行,並且返回調用他的程序 在他後面的值。我們來看個例子:

log(returnTest());

function returnTest(){

        return 123

}

這個函數的運行結果就是在日誌上打印了123。他的運行效果來說很簡單,而實質上是先運行了log函數,然後他去調用returnTest函數去獲取返回信息,最後得到了函數返回的123,將其輸出。        

當然因爲js使用的是泛型所以return後面可以跟任何數據類型(字符串記得加引號),也可以返回null。在一個函數運行結束時,也可以理解爲默認返回null

3.關於函數名         

關於函數名也要稍微提一下,其實函數,也算是一種數據類型,所以他的名字和變量名一樣的限定規則,詳細可以看前面的文章。

4.關於函數的傳入參數      

  函數的傳入參數非常重要,比如說你需要給函數設置一些運行參數等。就會用到傳入參數。        

傳入參數的方法其實就是在創建函數的地方括號裏寫上傳入參數的名稱,這個變量會在你調用的時候創建,並且賦值爲傳入的值。注意:只有這個函數內的程序可以調取到這個變量。這個變量會在return時被銷燬。        我們具體來看一個例子吧:

t(666);

function t(num){

      log(num);

      log(num);

}

這個程序的運行結果就是會輸出兩次666,這個函數的作用就是輸出兩次傳入的值(這邊傳入的就是666)         函數還可以傳入多個參數,中間用逗號(英文半角)隔開,我們直接來看一個例子:

addLog(123,456);

function addLog(n,m){

    log(n+m)

}

我們來詳細解釋一下這個程序的運行吧:首先運行的是第一行,調用了這個函數,函數創建的時候也創建了變量n和m,並賦予了初始值,123和456,然後運行log函數,把123和456相加傳入其中輸出了579        

其實我們調用的那些全局函數等,就是可以理解爲是不在我們文件中的函數,熟練運用這些函數,可以大幅減少我們程序的內容。像我們autojs可以調用所有java和android及其內部提供的函數。至少有十萬甚至百萬個函數。所以學習的路還很長..........

7.關於同名函數        

不同於變量,如果傳入參數數量不同的話,他可以同名。而你在調用函數的時候,會根據你傳入參數的個數,選擇適當的函數。         我們直接舉個例子:

chooseFunction(1,2)

function chooseFunction(a){

    log(a)

}

function chooseFunction(a,b){

    log(a+b)

}

至此,auto.js的語法學習完畢,還有一些關於設備等的寫法可以再查看教程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章