3

以下咖啡脚本代码

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

4 回答 4

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

于 2013-10-30T17:22:45.830 回答
0
a isnt undefined

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

a?

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

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

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

于 2013-10-30T17:30:44.537 回答
0

在 JavaScript 中,void运算符对表达式求值,然后返回undefined。所以void 0返回undefined。因此isnt undefined严格测试 undefined 而?检查undefinedand null

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

于 2013-10-30T17:22:39.437 回答
0

来自Coffeescript 网站

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

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

因此,综上所述,您示例中的第一个检查将返回trueif 且仅当ais not undefinedtrue如果ais notundefined和 not ,第二个将返回null

于 2013-10-30T17:24:53.647 回答