以下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;
}
两张支票是否相同?他们在什么条件下有所不同?
答案 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
严格测试未定义的?
对undefined
和null
的检查。
在任何情况下,检查的值都是null
而不是undefined
,因为类型值明显不同,这两者会有所不同。
答案 2 :(得分:0)
另一方面,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语法有基本了解的人来说很清楚。