检查未定义和null的不等式(!==)和检查未定义和null的柯夫不等式(!=)之间有区别吗?
Is there a difference between checking for inequality (!==) against undefined and null and just checking for corcive inequality (!=) against null?
如果我将变量传递给Coffescript中的存在运算符,它将被转换为一对!==
比较:
compiles to
Coffeescript ------> JS
a? typeof a !== "undefined" && a !== null;
但是如果我使用文字或表达式,它会使用!=
比较:
compiles to
Coffeescript ------> JS
17? 17 != null;
//same thing for regexps, strings, function calls and other expressions
//as far as I know.
有什么理由更喜欢双!==
s而不是较短的!= null
,除了可能使JSLint高兴吗?
简短的回答:它们在行为上是等同的,!= null
编译是一种优化。无论如何,x?
意味着x
既不是null
也不是undefined
。
人们在CoffeeScript问题跟踪器上问了很多。x != null
没有作为x?
的编译输出到处使用的原因是,如果x
不存在,x != null
(或与x
的任何其他比较)会导致运行时错误。在Node REPL上试试:
> x != null
ReferenceError: x is not defined
"不存在",我的意思是没有var x
,没有window.x = ...
,并且你不在一个x
是参数名称的函数中。(CoffeeScript编译器无法识别window.x
情况,因为它没有对您所处的环境做出任何假设。)因此,除非在当前作用域中有var x
声明或名为x
的参数,否则编译器必须使用typeof x !== "undefined"
来防止进程可能崩溃。
我可以理解为什么人们对此感到困惑。ECMAScript:
a?
等价于:
typeof a !== 'undefined' && a !== undefined && a !== null && a !== 0 && a !== false && a !== '';
Coffeescript重构为:
typeof a !== "undefined" && a !== null;
意味着:
var a = false;
a?; // evaluates to true?
正确吗?
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 如何检查管道中未定义的项目
- 主干-不管怎样,检查事件以前是否绑定过
- 使用javascript检查多个输入值,并在1次检查中标记多个输入框
- 递归使用 eval() 是检查程序执行的好方法吗?
- 检查onsubmit doenst work jquery contactform上的函数
- JavaScript 检查隐藏字段中的值并将其设置为隐藏字段值
- API密钥使用和检查示例
- 如何让程序检查所选单词中是否有按键
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 用于检查数组中是否存在元素的javascript自定义方法
- 如何检查字符串的一部分与数组匹配
- Jquery如何检查今天的时间大于使用给定时间
- 使用javascript反复检查用户在facebook上的登录状态
- 使用 jQuery 检查所有值是否为空或已填充
- 使用Javascript使用数组检查文本框中的值
- JavaScript代码未正确检查ajax请求
- 如何检查用户在html5视频播放器中观看了完整的视频
- 检查未定义和null的不等式(!==)和检查未定义和null的柯夫不等式(!=)之间有区别吗?