2016-09-20 34 views
3

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

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

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

test(null); 
test(undefined); 

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

你想检查两个,或只是一个? – baranskistad

+0

我想检查两个 – user2954463

+1

这是好的主观和坏主观之间的边界。我会这样说,[eslint提供了一个可配置的设置来允许'null'检查的异常](http://eslint.org/docs/rules/eqeqeq)。 – zzzzBov

回答

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) {... 

是比任何以前的选项简洁得多,但它带有吞咽其他falsey的行李值。通过掉毛执法


其他注意事项:

如果你遵循的Crockford's JSLint的严格,==从未的耐受性,在理解是一种工具,是“有时是有用的”,而是“主要危险” ISN不值得冒险。

ESLint另一方面,通过提供option to allow null作为特定例外,允许对规则进行更宽松的解释。

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

您需要'myVar == null'(或'myVar == undefined'),而不是'!myVar';后者也会接受'0',''''''''false'和'NaN' ... – Frxstrem

+0

第二个片段:'undefined','null','0'或其他任何falsey – qxz

+0

注意:第二个例子会吞下一些你可能不想要的东西,比如'0'和'NaN'。如果这是不受欢迎的,请参阅第一个示例。 – Amy

4

== undefined并且== nullboth equivalent以检查该值是未定义的还是空的,而没有其他。

至于“可接受”,取决于谁在查看代码,以及您的linter是否配置为忽略这种特殊情况。

我可以肯定地告诉你,一些缩小器已经为你做了这个优化。

+0

如果你想测试一个变量是否是'undefined',那么你应该使用'typeof'而不是直接测试。这只是一个好习惯。 –

+0

@AaditMShah为什么? – qxz

+0

正确的,为了检查它是*完全* null还是*完全*未定义,作者似乎已经知道如何做正确的事情:'==='。 – Brian

相关问题