[英]Odd behaviour in Javascript
所以在玩一些 js 代碼時,我遇到了一些有趣的事情。 問題陳述就像 -
給定一個字符串,使用 switch case 來評估以下條件: -
如果字符串的第一個字符在集合 {a, e, i, o, u} 中,則返回 A。
如果字符串的第一個字符在集合 {b, c, d, f, g} 中,則返回 B。
如果字符串的第一個字符在集合 {h, j, k, l, m} 中,則返回 C。
如果字符串的第一個字符在集合 {n, p, q, r, s, t, v, w, x, y, z} 中,則返回 D。
而且我知道這不是最好的實現,所以不要@我。
function getLetter(s) {
let letter;
switch(s[0]){
case 'a'||'e'||'i'||'o'||'u':
letter='A'
break
case 'b'||'c'||'d'||'f'||'g':
letter='B'
break
case 'h'||'j'||'k'||'l'||'m':
letter='C'
break
case 'n'||'p'||'q'||'r'||'s'||'t'||'v'||'w'||'x'||'y'||'z':
letter='D'
break
}
return letter;
除最后一種情況外,所有情況都可以正常工作。 在最后一種情況下,“letter”的值僅在字符串以“n”開頭時設置為“D”,在 label 的情況下不設置任何其他字符。 為什么會這樣? 真正好奇。
在 JavaScript 中, a || b
a || b
如果它是真的,則返回a
的值(這通常在 Stack Overflow 的其他地方得到回答)。 由於非空字符串是真實的,這就是您的 switch 語句實際上的樣子:
switch(s[0]){
case 'a':
letter='A'
break
case 'b':
letter='B'
break
case 'h':
letter='C'
break
case 'n':
letter='D'
break
}
換句話說,所有||
位實際上變得無關緊要,並且您的 switch 語句實際上只占四個字母。
實際上, getLetter('e')
也返回undefined
。
switch(s[0]){
case 'a': case 'e': case 'i':: case 'o': case 'u':
letter='A'
break
case 'b': case 'c': case 'd': case 'f': case 'g':
letter='B'
break
case 'h': case 'j': case 'k': case 'l': case 'm':
letter='C'
break
case 'n': case 'p': case 'q': case 'r': case 's': case 't': case 'v': case 'w': case 'x': case 'y': case 'z':
letter='D'
break
}
將按您的意願工作。
此外,如果可以保證 s[0] 是字母表,則可以重寫:
default:
letter='D'
break
這也不適用於其他任何情況。 它只評估第一種情況。
如果您想使用多個案例,您應該以這種格式進行:
switch(s[0]){
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
letter = 'A'
break;
case 'b':
case 'c':
...
...
letter = 'B'
break;
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.