上一篇文章咱們瞭解到瞭如何在 AHK 中比較字符串,但有一個細節我故意忽略了,也就是如何判斷一個字符串是否爲空(或者說一個變量是否爲空,AHK 中空變量、空字符串和未定義變量是一回事)。按理說這應該是一個很簡單的問題,一筆帶過便可,無需單獨寫一篇文章來介紹。對其餘語言也許是這樣,但 AHK 在這個問題上存在一些麻煩,值得一提。編程
a := "" ; 方法一: ; = 也可替換成 ==,由於空字符串無大小寫問題,不贅述 if (a = "") { ; 條件成立 } ; 方法二: if (a) { ; 作正常的事情 } else { ; 條件成立 }
方法一就是其餘編程語言中的方法,無需過多解釋。方法二是一種簡化的寫法,在多數狀況看起來也是正常的,但存在一些特殊狀況。微信
在一些特殊狀況,方法二存在問題。編程語言
若是變量爲字符串 "0",或者整數 0,或者浮點數 0.0:函數
a := "0" ; 或者 ; a := 0 ; 或者 ; a := 0.0 ; 方法一: ; = 也可替換成 ==,由於空字符串無大小寫問題,不贅述 if (a = "") { ; 條件不成立 } ; 方法二: if (a) { ; 作正常的事情 } else { ; 條件成立,判斷錯誤 }
恐怕沒有人認爲一個長度爲一的字符串 "0" 是空字符串。但第二種方法給出了錯誤的結果。緣由是 0 被認爲是布爾值 false,並且 AHK 中的字符串和數字並無那麼確切的區別,不少狀況能夠自動相互轉換,直接用 if 判斷天然不經過,看來這個簡化仍是要不得。code
還有一種特殊狀況是空對象 Object()。一般來講,咱們不該該認爲 Object() 是空變量,但某些庫的做者可能不嚴謹,在本應返回空變量的地方返回了 Object()(我印象中遇到過這樣的問題,但今天沒有復現出來,若是之後發現了再舉例)。若是用方法一判斷,就可能出問題。對象
a := Object() ; 方法一 ; = 也可替換成 ==,由於空字符串無大小寫問題,不贅述 if (a = "") { ; 條件不成立 } ; 方法三 if (StrLen(a) = 0) { ; 條件成立 }
方法一認爲 Object() 不是空變量,那麼繼續將 a 傳遞下去處理,就可能出問題。方法三是調用 StrLen() 函數來檢查字符串的長度,它成功發現了這不是一個有效的字符串。繼承
但用 StrLen() 函數判斷也存在問題,一個很嚴重的問題是方法三的耗時要比方法一長一倍以上。由於調用函數須要一些額外開銷,在幾乎全部語言都是如此。若是這個判斷在一個很大的循環裏邊,額外的開銷是很大的。ip
另外 Object() 是否算空變量或者空字符串,這實際上是有爭議的。我我的是認爲不該該算,但在某些語言中,全部變量類型都是從 Object 類型繼承來的,那麼就應該算。在用一些庫時,仍是須要驗證一下是否存在 Object() 的問題,以避免之後出了問題沒有頭緒。字符串
一般狀況,用方法一判斷空字符串或者空變量就足夠了,簡單易懂。在某些特殊狀況,可能須要用方法三來判斷,但要付出額外的開銷。另外本文可能還有一些細節沒有提到,我想起來後再補充。變量
付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活訂價,歡迎諮詢,微信 ly50247。