highlight.js

星期日, 9月 25, 2011

檢查物件是否具有指定的屬性:JavaScript 的 in 運算子

記憶中好像沒有好好認真學過 JavaScript, 多半是隨著應用就邊用邊學, 所以常常在遇到問題時才去查, 前幾天就遇到想要確認某一物件是否具有指定的屬性, 才發現不知道該怎麼做?直覺想到的是用 for in 列舉所有的屬性之後再一一檢查, 但總是覺得不可能只有這麼笨的方法, 一查才知道原來 in 並不是指能與 for 配合使用, 而是可以單獨運作, 它的作用就是檢查左邊運算元是否為右邊運算元的屬性。例如如果有一個這樣的物件:
var obj = {1:"one","two":"two"};
那麼就可以利用 in 運算子檢查是否具有某屬性。以下就以 node.js 為例, 示範 in 運算子的用法:
console.log(1 in obj);
console.log(2 in obj);
console.log("1" in obj);
console.log("two" in obj);
這一段程式的輸出結果如下:
D:\TEMP>node test.js
true
false
true
true
由於 1 是 obj 的屬性, 所以第一個輸出是 true, 而 2 並不是 obj 的屬性, 所以第二個輸出就是 false。要特別留意的是第三個輸出結果為 true, 這是因為在 JavaScript 中, 物件的屬性一定是字串, 如果你指定的屬性名稱是數值, 也會先被轉為字串, 因此, 雖然我們在建立物件時用了 1 當作屬性名稱, 實際上屬性的名稱為 "1", 所以第三個輸出也是 true。

星期五, 9月 09, 2011

Node.js 學習資源記錄

由於最近對於 node.js (官網說正式名稱為 Node, 但大家也稱它為 Node.js) 很有興趣, 所以花了一點時間學習, 不過因ˋ為我自己的工作平台都是 Windows, 因此在使用 node.js 時常遇到一些完全以 Linux 說明, 沒提到 Windows 下怎麼辦的狀況, 經過網路爬文後獲得解決,所以趕緊把這些資源記錄下來:

  1. 怎麼安裝 Node?
  2. 其實超簡單, Node.js 官網上已經有預先編譯好的 Node.exe, 沒錯, 就是單一個執行檔, 下載下來就可以用了!
  3. Windows 平台沒有 NPM, 怎麼安裝 Node 的模組?
  4. 不用怕, 根據 Francis Adu-Gyamfi 的 Node.js on Windows: Who Needs NPM? 這一篇文章, 只要將所需要的模組從 Github 上下載下來 (ZIP 格式), 解開後整個複製到 Node.exe 所在的資料夾下, 將模組資料夾從常而雜亂的名稱重新命名為模組名稱即可。
  5. 有 Node 下現成的 Web Framework 可以用嗎?
  6. 大部分的 Node 教學都是教你如何自己幹出一個 Web Server, 但如果不想這麼累, express 就是個不錯的選擇, 至於如何在 Windows 下安裝, 其實就跟剛剛提過安裝模組的方式一樣, 也可以參考 Martin 所撰寫的 Getting Started with NodeJS on Windows 這篇文章。
  7. Node 初學入門教材?
  8. 我找過許多入門學習的文章, 後來發現這本由 Manuel Kiessling 撰寫的 The Node Beginner Book 電子書真的不錯, 可以讓你對於 Node 所謂 event-driven 以及 non-blocking 的概念有基本的認識, 以後應該不會把 Node 亂用一通, 極推薦!

星期一, 9月 05, 2011

Tera Term Portable 版本

Tera Term 雖然沒有正式的可攜版, 不過它的開發中版本是以可攜的方式公開, 所以如果不顧慮是開發中版本的話, 就可以當成可攜版使用, 也是不賴喔!

Tera Term 開發中版本:

'via Blog this'

星期日, 9月 04, 2011

EmEditor 使用的 TeraTerm Macro 語法檔

如果你使用 EmEditor 撰寫 TeraTerm 巨集, 那麼可以使用以下這個語法檔為巨集加上語法標示, 不過這個檔的內容沒有包含像是 waitregex 等較新版本 TeraTerm 才有的指令, 必須自己視需要加上。

TeraTermマクロのEmEditor構文ファイルを公開:

'via Blog this'

Tera Term Macro 的一個小陷阱

Tera Term 的 Macro 實在很好用, 不過我在使用時遇到了一個小陷阱, 如果你啟用了 local echo (不論是透過 Terminal Setup 或是 setecho=1 指令), 都會讓 local echo 的內容變成 waitln 等等待指令收到的第一行資料, 如果想等待的字串剛好與 local echo 回來的內容相仿, 就可能會發生錯誤。以底下這個範例來說:

setecho 1
timeout= 10

sendln 'CONNECT'
waitln 'HELLO''CONNECT'

if result = 1 then
	messagebox '收到 Hello' 'Info'
elseif result = 2 then
	messagebox '收到 connect' 'Info'
endif

end
原本預期能夠區分收到的字串是 'HELLO' 還是 'CONNECT', 但實際執行時會因為 local echo 回來 'CONNECT' 的關係, if 判斷永遠都是收到 'CONNECT', 即便遠端真的有回應 'HELLO' 也沒有用。如果一定需要 local echo, 那麼可以先執行 recvln 指令略過 local echo 回來的資料避免這個問題。