【问题标题】:Why using ('function' === typeof x) and not (typeof x === 'function') [closed]为什么使用 ('function' === typeof x) 而不是 (typeof x === 'function') [关闭]
【发布时间】:2013-02-12 05:19:48
【问题描述】:

在一些开源 JavaScript 项目中,我看到人们使用 ('function' === typeof x) 检查变量是否为函数。我想知道为什么人们使用它而不是 (typeof x === 'function')

我觉得第二种方式更自然。使用第一种方法有什么好的理由吗?表现?潜在的错误?还是只是风格问题?

【问题讨论】:

  • 只是偏好和/或习惯。
  • 如果你打错了并且只输入了=,那么将文字放在左边更有可能引发Exception
  • 是的,质疑 Yoda 条件的使用与质疑 CamelCase 与 under_score 的使用一样有用。或者为什么香草冰淇淋是最糟糕的。

标签: javascript conditional typeof


【解决方案1】:

这些被称为“尤达条件”(因为它们听起来像尤达):

有些人更喜欢它们,因为如果错误地使用了= 而不是=====,则会引发Invalid left-hand side in assignment 错误。以最常见的顺序(即if(count = 5))会发生静默分配,并会搞砸程序逻辑。

注意'function' === typeof x 不是一个很好的例子;因为typeof x 将计算为字符串,所以在这种情况下,放错位置的赋值运算符总是会抛出错误,而不管操作数的顺序如何。

【讨论】:

  • @Bergi 你在读我的心吗?我要添加完全相同的图片!
  • 我试图自己提交答案,但你比我快,我的没有任何改进:-)
  • 但是,我想知道这不是理由。你的逻辑会被打破,这种方法在测试中比语法错误更容易被忽视!
  • @hop 恰恰相反!忘记示例typeof x === 'function',因为无论顺序是什么,它都会抛出= 的错误(由于typeof 返回一个字符串)。但是count = 5 会默默地分配给count(逻辑错误),而5 = count 会抛出异常,在错误控制台中很明显。
【解决方案2】:

它们是相同的表达式。当您与===== 进行比较时,表达式的哪一侧是什么并不重要。

if(null === myVar)

if('hello' === str)

等等。都是有效的。

如果两个表达式中的一个很长,您可能希望将其放在右侧,以便眼睛更容易看到正在比较的内容。

【讨论】:

    【解决方案3】:

    没有可能没有原因,但它可能来自历史上的 = 和 == 差异,它确实很重要。看东西

    if (a = 5)
    

    if (5 = a)
    

    是第一个不检查a是否为5,而是将5分配给a。所以人们想出了反向检查,这会引发编译错误,因为你不能分配给 5 等。这样你可以在你忘记一个 = 时修复你的代码。所以这也可能是为了保持一致性。

    【讨论】:

      【解决方案4】:

      它们是相同的。一些 Java 程序员倾向于以这种方式编写它,作为 Java 中通常的最佳实践,编写 null != object.getSomething() 而不是 object.getSomeThing() != null。这是为了避免可能的 NullPointer

      但是,在 Javascript 中这是没有意义的。正如您所指出的,(typeof x === 'function') 是自然的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 2021-05-04
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        相关资源
        最近更新 更多