检查undefined / null时可以使用类型强制吗?

时间:2016-09-20 18:37:55

标签: javascript

是否可以使用类型强制(==而不是===)来检查undefined / null?

有什么缺点?有没有更好的方法来检查undefined / null?

澄清:我正在寻找一个将检查undefined和null的语句。

test(null);
test(undefined);

function test(myVar) {
    if (myVar != undefined) {
        alert('never gets called')
    }
}

3 个答案:

答案 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。请注意,如果您关心undefinednull之间的差异,则只需要单独测试它们:

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!
    }
}