最近在JavaScript中,我养成了使用
的习惯if(data !== "")
检查数据是否为空|| undefined ||空白字符串。
当我尝试使用
时if(data !== null)
//work here
Resharper向我抛出一个可怕的错误,说
“限定符可以为null或未定义”
我添加了一个jFiddle只是为了澄清:JsFiddle
我的问题是:这是ReSharper错误还是背后有什么问题?
答案 0 :(得分:11)
首先,你的习惯是错误的。使用:
if(data !== "")
仅检查空字符串。如果data
为undefined
或null
,则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
没有指向任何地方时null
为var
。
另一方面,等于""
的{{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
这可能听起来很明显,但如果你不理解上面的一些概念,你应该谷歌他们对语言有更好的理解,欢呼。