为什么!==""不等于!== null

时间:2014-06-25 16:20:13

标签: javascript resharper

最近在JavaScript中,我养成了使用

的习惯
if(data !== "")

检查数据是否为空|| undefined ||空白字符串。

当我尝试使用

if(data !== null)
   //work here

Resharper向我抛出一个可怕的错误,说

  

“限定符可以为null或未定义”

enter image description here

我添加了一个jFiddle只是为了澄清:JsFiddle

我的问题是:这是ReSharper错误还是背后有什么问题?

4 个答案:

答案 0 :(得分:11)

首先,你的习惯是错误的。使用:

if(data !== "")

仅检查空字符串。如果dataundefinednull,则if块仍将执行,因为!==会检查相等性而不执行任何类型转换。

其次,ReSharper没有问题。它试图告诉你,你可能犯了一个错误。 if(data !== null)只会检查null。 undefined并且空字符串仍将返回true并导致块执行。 ReSharper警告你,你可能犯了错误(因为你很少需要检查null)。

请记住undefined !== null !== ""。您可以尝试几个正在提及的快捷方式,但如果您真的希望您的代码是彻底的,只需检查所有三个。如果您担心代码太长,请将支票移至实用程序方法:

function hasValue(var data) {
    return (data !== undefined) && (data !== null) && (data !== "");
}

答案 1 :(得分:5)

简而言之,当var没有指向任何地方时nullvar。 另一方面,等于""的{​​{1}}是指向包含空字符串的变量的已定义var。这基本上是不同的。

<强> [编辑] 正如@ jfriend00正确指出的那样,null是javascript中的特定值。区别在于null""不同,后者是一个空字符串,因此不为空。

未初始化的var的正确值为undefined

答案 2 :(得分:1)

Null和undefined可以用同样的方式处理

如果数据未定义(或为空),

if (typeof data === "undefined")将返回true,所以

if (typeof data !== "undefined")
如果已经定义了数据,那么

将返回true(因此不为null),然后您可以检查它是否为空字符串,

if (data.length == 0)
如果字符串为空,

将返回true。

答案 3 :(得分:0)

这是一个ReSharper错误还是背后有什么东西?

由于resharper中的linter,可能会抛出错误。

检查数据是否为空|| undefined ||空字符串,您可以将数据值强制转换为布尔值(由js隐式完成):

if(!data) //implicit coercion

或明确地做:

if(!Boolean(data)){ //same as above
//if data is a falsy value (false, 0, null , undefined, NaN, '' or ""), run
}

您可以查看真实和虚假值列表here

这可能听起来很明显,但如果你不理解上面的一些概念,你应该谷歌他们对语言有更好的理解,欢呼。