簡體   English   中英

Javascript 中的奇怪行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM