JSLint预期'===',而是看到'=='
最近,当我提出这个错误时,我通过JSLint运行了一些我的代码。 我认为这个错误是有趣的,但它是自动假定所有==应===。
这真的有意义吗? 我可以看到很多不想比较types的实例,我担心这实际上会导致问题。
“预期”这个词意味着这个应该每一次都要做……这对我来说是没有意义的。
国际海事组织,盲目地使用===
,而没有试图了解如何types转换工作没有多大意义。
等号运算符==
的主要担心是比较规则取决于所比较的types可以使运算符不可传递,例如,如果:
A == B AND B == C
并不能保证:
A == C
例如:
'0' == 0; // true 0 == ''; // true '0' == ''; // false
在比较相同types的值时,严格等于运算符===
并不是真的有必要,最常见的例子是:
if (typeof foo == "function") { //.. }
我们把总是一个string的typeof
运算符的结果与一个string文字进行比较…
或者,当你知道types强制规则时,例如,检查是否为null
或undefined
东西:
if (foo == null) { // foo is null or undefined } // Vs. the following non-sense version: if (foo === null || typeof foo === "undefined") { // foo is null or undefined }
JSLint本质上比Javascript语法所允许的更具防御性。
从JSLint文档:
==
和!=
运算符在比较之前input强制types。 这是不好的,因为它会导致' \t\r\n' == 0
为真。 这可以掩盖types错误。与以下任何值进行比较时,请使用
===
或!==
运算符(不要执行types强制转换):0 '' undefined null false true
如果你只关心某个值是真的还是虚假的 ,那就用简写的forms。 代替
(foo != 0)
说啊
(foo)
而不是
(foo == 0)
说
(!foo)
===
和!==
运算符是首选。
请记住,JSLint强制一个人应该是什么好的JavaScript的想法。 在实施所build议的更改时,您仍然需要使用常识。
一般来说,比较types和值将会使你的代码更安全(当你的types转换不符合你的想法时,你将不会遇到意外的行为)。
三等于不等于双等同,因为除了检查双方是否是相同的值之外,三等于还检查它们是相同的数据types。
所以("4" == 4)
是真的,而("4" === 4)
是假的。
三重平等也运行得稍微快一点,因为在给出答案之前,JavaScript不必浪费时间进行任何types的转换。
JSLint的目的是为了尽可能严格地制作JavaScript代码,以减less不明确的错误。 它强调了这样的事情,试图让你以强制你尊重数据types的方式进行编码。
但是JSLint的好处在于它只是一个指导。 就像他们在网站上说的那样,即使你是一个很好的JavaScript程序员,也会伤害你的感觉。 但是你不应该觉得有必要听从它的build议。 如果你已经阅读了它的内容并且理解了它,但是你确定你的代码不会被破坏,那么你就没有强迫你改变任何东西。
你甚至可以告诉JSLint忽略检查类别,如果你不想被轰炸警告你不会做任何事情。
来自http://javascript.crockford.com/code.html的引用:;
===和!==运营商。
使用===和!==运算符几乎总是更好。 ==和!=运算符types强制。 特别是,不要使用==与falsy值进行比较。
JSLint是非常严格的,他们的“webjslint.js”甚至不通过他们自己的validation。
那么它不能真正引起问题,只是给你build议。 要么接受,要么离开它。 这就是说,我不确定它有多聪明。 可能有其中没有提出这个问题的背景。
如果你想testing虚假。 JSLint不允许
if (foo == null)
但确实允许
if (!foo)
为了帮助解释这个问题,并解释了为什么NetBeans(from)7.3已经开始显示这个警告,这是NetBeans错误跟踪器响应摘录,当有人报告这是一个错误:
在JavaScript中使用===而不是==是个好习惯。
==和!=运算符在比较之前input强制types。 这是不好的,因为它会导致'\ t \ r \ n'== 0为真。 这可以掩盖types错误。 JSLint不能可靠地确定==是否正确使用,因此最好不要使用==和!=,而应始终使用更可靠的===和!==运算符。
参考
- 找不到模块'../build/Release/bson'] code:'MODULE_NOT_FOUND'} js-bson:无法加载c ++ bson扩展,使用纯JS版本
- 使用jQuery从JSON数组中获得唯一的结果
- 量angular器:element.getText()返回一个对象,而不是String
- 如何获得jQuery的CSS属性的数字部分?
- 使用JavaScriptdynamic更改元素样式属性
- asynchronousJavaScript – callbackvs延期/承诺
- 什么构造x = x || 你的意思是?
- javascript:加variables前的符号
- 未能在“DOMWindow”上执行“postMessage”:https://www.youtube.com!== http:// localhost:9000