推 terlin10:No給推~ 04/15 13:57
推 kalapon:雖然我看不懂str||'' 可是結果是我要的,有空來試試,謝謝 04/15 20:06
推 s25g5d4:還是判斷式... 簡單的說就是 a or b 04/15 20:18
我認為這不能算是判斷式
因為其原理是利用JavaScript邏輯運算子的 && || 的特性
其運算過程是由左邊的運算元開始
往右依序看"運算結果" (此指 a==5、b>5、c+d、e>>5、f&255 等等)
只要遇到"運算結果"觸發可回傳的狀態,即回傳
回傳什麼?運算元的"值"
巧妙的就在這個回傳球啊
|| 的運算過程
每一個運算結果轉換為Boolean值 (暫稱此值為bool)
第一次碰到bool為true時,回傳該運算元的"值"
當所有bool都是false,回傳的是最右邊的"值"
如果運算結果是Boolean值,或運算元資料型態是Boolean
那返回值是很直觀的true或false
x = 'me'=='30cm' || '鄉民'== '30cm'; // x為true(誤);
得到 x 為 fasle
若運算元是non-Boolean,其返回的是其"值"(value),而非Boolean值
a = false || true;
b = 'food' || true;
c = false || 'yo~' || 'hi~';
d = false || '' || 'kerker';
e = false || '' || 0;
上面會得到
a 為 true
b 為 'food' //回傳其值
c 為 'yo~'
d 為 'kerker'
e 為 0 //當所有運算結果邏輯上是false,最後是回傳最右邊的值
而 && 邏輯運算過程:
其返回是"值"或者Boolean值的原理是與||相同
不同的是,其返回的"值"來自哪一個結果
或者可以說是整個相反過來
同樣,每一個運算結果轉換為Boolean值 (暫稱此值為bool)
當所有bool都是true,回傳的是最右邊的"值"
否則,回傳第一次碰到bool為false的運算元的"值"
a = '1' && '2' && '3';
b = '1' && '2' && false;
c = 1 && 0 && true;
上面會得到
a 為 '3'
b 為 false
c 為 0
竟然打了一堆
簡單來說
邏輯運算回傳的並非其"結果",而是其"值"
會得到true和false也是因為它們即是Boolean型態的值
所以這解法頂多說是邏輯運算子和運算元做運算
並使用其回傳結果而已
而non-Boolean型態轉成Boolean值的規則
下面推文有提到了
→ s25g5d4:在JS裡 預期結果為boolean型態時 undefined會被轉成false 04/15 20:19
→ s25g5d4:所以str假如是undefined 就會轉成false 因此會跳到||右邊 04/15 20:20
→ s25g5d4:的"" 04/15 20:20
推 s25g5d4:不過這樣有個缺點 假如str為數字0 那0將不會被輸出 04/15 20:24
沒錯,會有這樣的問題
→ s25g5d4:因為0也會被轉成false 所以我還是喜歡用?: 04/15 20:25
→ s25g5d4:因為用?:可以用str === undefined來判斷 04/15 20:25
→ s25g5d4:另外除了0以外 任何在期待型態為boolean而產生的型態改變 04/15 20:27
→ s25g5d4:情況下 只要轉成false的都會產生這種情況 04/15 20:28
推 s25g5d4:不過如果確定str是字串的話 只要不是空字串都不會被轉成fa 04/15 20:30
→ s25g5d4:lse就是了 04/15 20:30
這樣做的確保險多了
不過考慮到題目本身就想找一個技巧
而非完全解
不然直接請原po給str初始值就好了
→ grence:test.join('<br');//XD array不建議用 for in,不保證順序 04/15 20:36
→ grence:test.join('<br>'); 04/15 20:38
原po的array內是object
→ grence:就我看到的時間,那是第三近的…總之就是這問題很常見。 04/15 20:48
感謝兩位提醒
雖然我這樣回很像在挑語病 XDD
不過一方面題目沒要求排序
另一方面,也要前提是必須確保順序時,才不建議用 for in
for in本身並不是問題,問題在可能被誤用
容我還它一點點清白
http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays
雖然這裡還是講它的issue比較多 XDD
※ 編輯: No 來自: 111.252.102.243 (04/16 00:11)
推 dreamerslab:受用良多 :) 04/16 00:13
※ 編輯: No 來自: 111.252.102.243 (04/16 00:40)
→ TonyQ:主要還是在於避免可能的問題。 04/16 09:03
→ TonyQ:其實沒什麼清不清白的問題,只是把可能會有的問題點出來而已 04/16 09:03
→ TonyQ:把所有可能的影響講清楚,讓使用者自己選囉。 04/16 09:03
→ TonyQ:所謂的trick,另一個角度也是雙面刃。謹慎為上。XD 04/16 09:04
推 tomin:b = '1' && '2' && false; //得到false 04/16 12:48
感謝更正
推 kalapon:感謝and筆記先,目前就是用空字元把它矇混過去了,至少沒有 04/16 13:23
→ kalapon:出現undefined就可以,user只會當作上面多了一行留白 04/16 13:24
→ kalapon:我會拿這個地方好好練習各位說的方法,感恩 04/16 13:25
※ 編輯: No 來自: 111.252.102.243 (04/16 16:46)