【问题标题】:Why is this function behaving differently than I expected? [closed]为什么这个函数的行为与我预期的不同? [关闭]
【发布时间】:2023-02-04 03:05:13
【问题描述】:

最近参考Python代码写了一段javascript代码,结果并没有按预期出来。

这是代码。

const languages = ['python', 'perl', 'c', 'java'];

for (let lang of languages) {
    if(lang == "python" || "perl") {
        console.log(`${lang} need interpreter`);
    } else if (lang == "c" || "java") {
        console.log(`${lang} need compiler`);
    } else {
        console.log("Not a support language.");
    }
}

这是我引用的 python 代码。

languages = ['python', 'perl', 'c', 'java']

for lang in languages:
    if lang in ['python', 'perl']:
        print("%6s need interpreter" % lang)
    elif lang in ['c', 'java']:
        print("%6s need compiler" % lang)
    else:
        print("should not reach here")

// python need interpreter
// perl need interpreter
// c need compiler
// java need compiler

我用谷歌搜索但找不到。所以,请帮助我,提前谢谢你!

【问题讨论】:

  • if(lang == "python" || "perl") {这样的行需要是if(lang == "python" || lang == "perl") {,否则你做的是if("perl"),这将永远是真的。

标签: javascript


【解决方案1】:
lang == "python" || "perl"

不做你想做的事。利用

lang == "python" || lang == "perl"

【讨论】:

  • 很高兴解释lang == "python" || "perl" 实际评估的内容,因为 OP 似乎是一个(非常)初学者。
  • 非常感谢你的回复。
  • @RoboRobok 我在回答中解释了
【解决方案2】:

因为您的第一个条件始终为真。

在 Javascript 中,if(var) 始终为真,除非 var 是一个假值 (0, null, undefined, '', NaN)

你的条件是lang === 'python''perl''perl'不是falsy,所以总是true

你应该这样写:

if(lang === "python" || lang === "perl")

Javascript 中的另一个好习惯是,最好使用 === 而不是 ==,因为 == 会尝试转换类型以进行匹配然后进行比较,但 === 会检查是否完全匹配

【讨论】:

    【解决方案3】:

    以下表达式:

    lang == "python" || "perl"
    

    评估为:

    <lang> == <'python' || 'perl'>
    <'java'> == <'python'> ~ <non-empty string> OR <non-empty string> is <first non-empty-string>
    <false> ~ <non-empty string> <double-equals> <different non-empty string> is <false>
    

    这意味着 'python' 将始终是右侧的值。这是因为逻辑或 (||) 在 JavaScript 中用作短路评估。如果您有一系列虚假值,将选择第一个非虚假值。

    // First truthy
    let a = undefined || null || 0 || false || 'foo'; console.log(a); // foo
    
    // First non-null
    let b = undefined ?? null ?? 0 ?? false ?? 'foo'; console.log(b); // 0
    
    // Assign: 0 || 1 = 1
    let c = 0; c ||= 1; console.log(c); // 1
    
    // Assign: 0 ?? 1 = 1
    let d = 0; c ??= 1; console.log(c); // 1
    
    // Assign: 0 || null = null
    let e = 0; e ||= null; console.log(e); // null
    
    // Assign: 0 ?? null = 0
    let f = 0; f ??= null; console.log(f); // 0

    在这里使用双等号 (==) 或三等号 (===) 并不重要。只要 lang 不等于 'python',条件就始终是 false

    您可以使用 Array.prototype.includes 在项目列表中进行检查。这感觉更 pythonic,所以我会走这条路。比lang === 'python' || lang === 'perl'简单;特别是如果您需要检查的语言列表很长。

    const languages = ['python', 'perl', 'c', 'java'];
    
    for (let lang of languages) {
      if (['python', 'perl'].includes(lang)) {
        console.log(`${lang} needs an interpreter`);
      } else if (['c', 'java'].includes(lang)) {
        console.log(`${lang} needs a compiler`);
      } else {
        console.log('Not a supported language.');
      }
    }

    tl;博士

    有时,一种语言的语法在另一种语言中显得非常不同。

    • Python:lang in ['python', 'perl']
    • 脚本:['python', 'perl'].includes(lang)

    【讨论】:

    • 这段代码是我想要实现的。谢谢你,我学到了很多。
    • @Choiman 阐述并修复了一些东西
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 2021-11-18
    • 2020-03-24
    • 2021-08-24
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多