是否可以使用类型强制(==而不是===)来检查undefined / null?
有什么缺点?有没有更好的方法来检查undefined / null?
澄清:我正在寻找一个将检查undefined和null的语句。
test(null);
test(undefined);
function test(myVar) {
if (myVar != undefined) {
alert('never gets called')
}
}
答案 0 :(得分:4)
== undefined
和== null
both equivalent来检查值是未定义还是null,而不是其他内容。
至于“可接受”,这取决于谁在查看代码,以及你的linter是否配置为忽略这种特殊情况。
我可以肯定地告诉你,一些缩小器已经为你做了这个优化。
答案 1 :(得分:4)
我将尝试尽可能客观地解决这个问题,但它会处理一些糊涂的“最佳实践”意见,这些意见可能会引发人们忘记不止一种方法做事。
使用类型强制(
==
而不是===
)检查undefined
/null
是否可以接受?
无论是否有人告诉您,编写代码都是可以接受的。包括我在内。
这在这里并没有多大帮助,所以让我稍微扩展一下,我会让你决定你的感受。
代码是一种可用于解决问题的工具,==
是JavaScript代码中用于解决特定问题的工具。它有一个well-defined algorithm,用于检查两个参数之间的相等类型。
===
是一个不同的工具,可以解决不同的,特定问题。它还有一个well-defined algorithm,用于检查两个参数之间的相等类型。
如果一个工具或另一个工具适合您的用例,那么您应该毫不犹豫地使用该工具。
如果您需要锤子,请使用锤子。
但是if all you have is a hammer, then everything looks like a nail,这是==
的核心问题。来自其他语言的开发人员通常不了解==
的工作原理,并在===
合适时使用它。
事实上,大多数用例都是===
应优先于==
,但正如您在问题中提到的那样:在这种情况下并非如此。
有什么缺点?
如果您放宽===
的标准并允许开发人员使用==
,您很可能因滥用==
而感到痛苦,这就是为什么虔诚地坚持===
某些人可能会接受,而对其他人来说似乎是愚蠢的。
if (val === null || val === undefined) {...
写起来并不是特别困难,而且非常明确意图。
可替换地,
if (val == null) {...
更加简洁,也不难理解。
有没有更好的方法来检查
undefined
/null
?
“更好”是主观的,但我会说,“不”,因为我不知道有任何改善情况的任何有意义的方式。
此时我还会注意到还有其他检查可以执行而不是 null
/ undefined
。 Truthy / falsey检查很常见,但它们是用于解决另一个特定问题的另一种工具:
if (!val) {...
比以前的任何一个选项都简洁得多,但它带有吞噬其他虚假价值的包袱。
关于通过linting执法的补充说明:
如果您遵循Crockford's JSLint的严格性,==
永远不会容忍,理解为“有时有用”但“大多数危险”的工具不是值得冒风险。
ESLint允许通过提供option to allow null
作为特定例外来更加自由地解释规则。
答案 2 :(得分:2)
测试未定义的理想方法是使用typeof
。请注意,如果您关心undefined
和null
之间的差异,则只需要单独测试它们:
test(null);
test(undefined);
function test(myVar) {
if (typeof myVar === "undefined") {
// its undefined
}
if (myVar === null) {
// its null
}
}
如果你不关心它是undefined
/ null
,那么就这样做:
test(null);
test(undefined);
function test(myVar) {
if (!myVar) {
// its undefined or null, dunno which, don't care!
}
}