最近一些開發緣故,在看jQuery的程式碼
看完果然還是覺得JavaScript只有一句話
「代誌絕對不是憨人想的那麼簡單」
光是function裡面所有的變數值都能共用和保留就夠吃驚了
勉勉強強可以去猜這是怎麼實作的
不過這個不是重點
而是 && 與 || 這兩個傳統上的邏輯連接運算子
看來是超出我的所知範圍,好像也只是小事情 q:
平常用歸用
自從看到jQuery之後才發覺還有這樣的特性
今天才剛接觸,概念還有點模糊
原則上從C和 Java來看,Operation的運算結果是布林值,也就是true或false
例如說C的 3 && 2,運算結果是 1,理論上這兩個運算結果應該不是 true就是false
但是JavaScript的運算值結果似乎是運算域本身
例如:
false && new Array => (new Array)
[] || [1, 2, 3, 4] => []
也就是說有了這項特性之後,就不用再寫那麼多字
最近開發常常會有需要先確認物件是否存在 (is undefined),再讀取物件屬性
傳統作法是寫
var variable;
if (typeof obj != "object") variable = obj.attr1;
有這項特性可以濃縮成
variable = obj && obj.attr1;
也就是說若 obj被認定為 true-equivalent,則會運算取得右運算域值 (即 obj.attr1)
當obj被認定為false-equivalent,則會取得左運算域值 (即 obj)
不過要注意的是
undefined、false、0、null都是 false-equivalent (在這個狀況下 "0"和""就不算了)
true、1本身也就是true-equivalent
因此運算結果可能不一定是undefined
就算是undefined也並不代表obj就是 undefined (仔細想想 obj = true以及 obj = false的狀況)
所以若發現設計並不單純 (也就是你的目的並不是只為了取得obj.attr1),一定要謹慎使用才行
P.S. 從chrome的測試看來,若單獨使用運算式
不知為啥左值若是JSON物件的話指令會出現語法錯誤 (如: {} || 3)
實際觀察,推測應該是因為JSON物件被當作是 Block 解讀的關係
留言列表