'如果不是未定义'和'如果是?'之间有什么区别?在coffeescript?

时间:2013-10-30 17:17:23

标签: javascript coffeescript

以下coffeescript代码

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;
}

两张支票是否相同?他们在什么条件下有所不同?

4 个答案:

答案 0 :(得分:1)

TLDR :通常,在检查变量是否存在时,foo?将是最安全的。

foo?检查foo既不是null也不是未定义的。如果没有声明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

答案 1 :(得分:0)

在JavaScript中,void运算符计算表达式,然后返回undefined。因此void 0会返回undefined。因此isnt undefined严格测试未定义的?undefinednull的检查。

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

答案 2 :(得分:0)

来自Coffeescript website

  

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

另一方面,

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

因此,当且仅当true不是a时,您的示例中的第一个检查才会返回undefined。如果true不是a而不是undefined,则第二个会返回null

答案 3 :(得分:0)

a isnt undefined
如果a未定义,则

评估为false,否则为

a?
如果a未定义或为null,则

计算结果为false,否则为true

所以唯一的功能差异是null是真还是假。

在可读性方面,第一个对任何人都很清楚,第二个是更短的,对于那些对coffeescript语法有基本了解的人来说很清楚。