以下咖啡脚本代码
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;
}
这两个检查是等价的吗?它们在什么条件下不同?
以下咖啡脚本代码
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;
}
这两个检查是等价的吗?它们在什么条件下不同?
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
a isnt undefined
如果 a 未定义,则为 false,否则为 true
a?
如果 a 未定义或为 null,则为 false,否则为 true
所以唯一的功能区别是 null 是真还是假。
就可读性而言,第一个对几乎任何人来说都很清楚,第二个更短,对任何对咖啡脚本语法有基本知识的人来说都是清楚的。
在 JavaScript 中,void
运算符对表达式求值,然后返回undefined
。所以void 0
返回undefined
。因此isnt undefined
严格测试 undefined 而?
检查undefined
and null
。
两者在任何情况下都会有所不同,即被检查的值是null
而不是undefined
类型值明显不同。
CoffeeScript 的存在运算符 ? 除非变量为 null 或未定义,否则返回 true。
isnt
,另一方面,只是转换为!==
,这意味着它是一个不相等的比较,没有类型转换。
因此,综上所述,您示例中的第一个检查将返回true
if 且仅当a
is not undefined
。true
如果a
is notundefined
和 not ,第二个将返回null
。