【问题标题】:Assignment with double ampersand "&&" [duplicate]带有双与号“&&”的赋值[重复]
【发布时间】:2012-10-04 10:08:49
【问题描述】:

我刚刚看到有人用这段代码:

ctx = canvas.getContext && canvas.getContext('2d');

双与号在这种情况下如何工作?难道不只是将“true”分配给 ctx 变量吗?

【问题讨论】:

  • 你尝试了一些可能的用例吗???但是不,尽管它可能会,这取决于函数返回的内容,如果它存在的话。
  • 您可能感兴趣:stackoverflow.com/questions/3826473/…,它是 Python,但它也适用于 JS(以及少数其他语言)。

标签: javascript


【解决方案1】:

如果canvas.getContext实际上是一个函数,它会将canvas.getContext('2d')的返回值赋给ctx

左边的部分只是为了避免错误。在尝试调用getContext() 之前,它会确保canvas 具有getContext 属性。这样,如果函数不存在,代码将不会调用canvas.getContext()。如果它没有先检查并在函数不存在时调用,则会将错误记录到控制台并停止执行。

【讨论】:

    【解决方案2】:

    这是在调用函数之前确保函数存在的常用方法。

    它是这样工作的(来自developer.mozilla.com):

    expr1 && expr2 如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,如果两个操作数都是 true&& 将返回 true;否则,返回false

    换句话说,除非必须,否则 Javascript 不会将操作数强制为布尔值。

    4 && 5 返回 5,不正确。

    在您的情况下,如果第一个表达式是 undefined(可转换为 false),则 ctx 将为 false,并且第二个表达式不会被评估。如果第一个表达式是一个函数(不能转换为 false),那么 Javascript 会计算第二个表达式,并将它的值赋给 ctx 变量。

    【讨论】:

    • 你和@Trott 的答案是正确的。尽管他确实先发了帖子,但我觉得这篇文章对实际发生的事情给出了更清晰的解释。不知道正确的礼仪是什么。
    • @AndyHin 我来晚了,但既然你提到了礼仪:你做对了。如果你觉得这是最好的答案,那么你应该接受它,即使它不是第一个正确的答案。重点是标记对您最有帮助并且最有可能帮助其他访问该站点的人的答案。我首先得到答案的事实并没有真正考虑到它。第一个答案对需要帮助的人没有帮助。最好的答案就是!
    • 只是好奇,但如果我们确实想要一个布尔结果怎么办?而不是返回第一个真值表达式的结果。
    • 您可以使用布尔对象强制表达式的结果,即Boolean(4 && 5) -> trueBoolean(undefined && 5) -> false
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多