【问题标题】:What's the difference between 'if a isnt undefined' and 'if a?' in coffeescript?'if a isnt undefined' 和 'if a?' 之间有什么区别?在咖啡脚本中?
【发布时间】:2013-10-31 01:48:36
【问题描述】:

以下咖啡脚本代码

if  a isnt undefined
  b = 1

if a?
  b = 1

编译成下面的javascript

var b;

if (a !== void 0) {
  b = 1;
}

if (typeof a !== "undefined" && a !== null) {
  b = 1;
}

这两个检查是否等效?它们在什么条件下不同?

【问题讨论】:

  • typeof 运算符的行为也有一些更好的地方。例如,比较a?a=a;a? 的编译输出。 es5.github.io/#x11.4.3
  • 您查找void 以了解它的作用吗?答案就在眼前。
  • 不只是 javascript,coffeescript 有一个 undefined? 的特殊情况,所以我想确保我没有遗漏任何东西。

标签: javascript coffeescript


【解决方案1】:

TLDR:一般来说,在检查变量是否存在时,foo? 是最安全的。

foo? 检查 foo 既不是 null 也不是 undefined。如果 foo 没有被声明,它不会抛出错误:

typeof foo !== "undefined" && foo !== null;
> false

var foo = null;
typeof foo !== "undefined" && foo !== null;
> false

var foo = 123;
typeof foo !== "undefined" && foo !== null;
> true

foo isnt undefined 检查 foo 不等于 undefined。如果 foo 没有被声明,它会抛出一个错误。如果 foo 为 null,它将返回 true:

foo !== void 0;
> ReferenceError // OH NO!

var foo;
foo !== void 0;
> false

var foo = 123;
foo !== void 0;
> true

var foo = null;
foo !== void 0;
> true // OH NO!

注意:void 0 等同于 undefined

【讨论】:

    【解决方案2】:

    在 JavaScript 中,void 运算符计算表达式,然后返回 undefined。所以void 0 返回undefined。因此,isnt undefined 严格针对 undefined 进行测试,而 ? 则针对 undefinednull 进行检查。

    两者在任何情况下都会有所不同,因为类型值明显不同,所以被检查的值是 null 而不是 undefined

    【讨论】:

    • 同样重要:foo !== undefined 在 foo 未声明时引发错误。
    【解决方案3】:

    来自Coffeescript website

    CoffeeScript 的存在运算符 ?除非变量为 null 或未定义,否则返回 true。

    另一方面,isnt 只是转换为!==,这意味着它是一个不相等的比较,没有类型转换。

    因此,总而言之,当且仅当 a 不是 undefined 时,您示例中的第一次检查将返回 true。如果a 不是undefined 而不是null,第二个将返回true

    【讨论】:

    • 同样重要:foo !== undefined 在 foo 未声明时引发错误。
    【解决方案4】:
    a isnt undefined
    

    如果 a 未定义,则为 false,否则为 true

    a?
    

    如果 a 未定义或为 null,则为 false,否则为 true

    所以唯一的功能区别是 null 是真还是假。

    就可读性而言,第一个对几乎任何人来说都很清楚,第二个更短,对任何具有咖啡脚本语法基本知识的人来说都是清楚的。

    【讨论】:

    • 同样重要的是:foo !== undefined 在未声明 foo 时引发错误。
    • @tybro0103 是的,但这不是这种情况下的选项之一。
    • @tybro0103 首先是coffeescript,它会为您处理。无论如何,他也没有在任何地方说 foo !== undefined。
    • alert a isnt undefined 计算结果为 alert(a !== void 0)。除非声明了a,否则它抛出错误。当然,您没有在 CS 中显式声明变量,但如果您没有首先在 CS 中执行导致该声明的操作,您将会收到错误。
    • 另外,当问题是关于检查变量的存在时,未声明的变量是非常可能的。也许您正在检查控制台是否存在(旧 IE 中不存在)。 console isnt undefined 会抛出错误; console? 不会。 OP 没有说他是否在其他地方声明了a,但他的代码肯定没有。他的代码原样会抛出错误。
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多