我知道以下是JavaScript中检查变量是否不是的两种方法null
,但我很困惑哪种方法最好使用.
我应该这样做:
if (myVar) {...}
Run Code Online (Sandbox Code Playgroud)
要么
if (myVar !== null) {...}
Run Code Online (Sandbox Code Playgroud) 我遇到过以下代码:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
我对JavaScript很新,但是,从我在这里读过的其他问题来看,我的印象是这段代码没有多大意义.
如果在除了以外的任何上下文中访问未定义的变量,您将收到错误typeof
.
更新:上述答案(引用)可能会产生误导.应该说"一个未声明的变量",而不是"一个未定义的变量".
正如我在Ryan♦,maerics和nwellnhof的回答中所发现的那样,即使没有为函数提供参数,也始终声明其参数的变量.这个事实也证明了下面列表中的第一项是错误的.
根据我的理解,可能会遇到以下情况:
调用该函数时没有参数,从而生成data
一个未定义的变量,并引发错误data != null
.
该函数专门用null
(或undefined
)作为其参数调用,在这种情况下data != null
已经保护内部代码,使得&& data !== undefined
无用.
该函数使用非null参数调用,在这种情况下,它将平凡地传递两个data != null
和 data !== undefined
.
问:我的理解是否正确?
我在Firefox的控制台中尝试了以下内容:
--
[15:31:31.057] false != null
[15:31:31.061] true
-- …
Run Code Online (Sandbox Code Playgroud) public void DoFoo<T>(T foo) where T : ISomeInterface<T>
{
//possible compare of value type with 'null'.
if (foo == null) throw new ArgumentNullException("foo");
}
Run Code Online (Sandbox Code Playgroud)
我故意只检查null,因为我不想限制a ValueType
等于它default(T)
.我的代码以这种方式编译和工作(ReSharper抱怨,但不是CodeAnalysis).虽然我想知道:
在一些遗留代码中,我遇到了以下空指针检查。
if( myPtr > 0 ) {
...
}
Run Code Online (Sandbox Code Playgroud)
通过此 if 检查检查空指针是否存在任何技术风险?
如何对动态对象执行空检查?
伪代码:
public void Main() {
dynamic dynamicObject = 33;
if(true) { // Arbitrary logic
dynamicObject = null;
}
Method(dynamicObject);
}
public void Method(dynamic param) {
// TODO: check if the content of 'param' is equal to null
}
Run Code Online (Sandbox Code Playgroud) 简介:
我有一些类可以完成相同的工作,但具有不同的值类型(例如浮点数或整数的向量).
现在我希望能够检查相等性,这种相等性也应该在类型之间起作用(例如vectorF == vectorI).
此外,应该可以进行空检查(vectorF == null).
方法:
我的方法是为==和!=运算符创建多个重载,每个可能的组合一个.
public sealed class VectorF
{
[...]
public static bool operator == (VectorF left, VectorI right)
{
// Implementation...
}
public static bool operator == (VectorF left, VectorF right)
{
// Implementation...
}
// Same for != operator
[...]
}
Run Code Online (Sandbox Code Playgroud)
问题:
使用多个重载,我不能只使用==运算符进行空检查,因为调用将是不明确的.
var v = new VectorF([...]);
if (v == null) // This call is ambiguous
[...]
Run Code Online (Sandbox Code Playgroud)
我知道有可能使用ReferenceEquals或null cast,但这种方法对我来说是一个严重的限制.
var v = new VectorF([...]);
if(object.ReferenceEquals(v, null)) // Would …
Run Code Online (Sandbox Code Playgroud) 我在方法参数上使用Findbugs和javax.annotation.Nonnull.
在私有方法上,我通常添加一个断言行来检查null
private void myMethod(@Nonnull String str) {
assert str != null
....
Run Code Online (Sandbox Code Playgroud)
最新的Netbeans版本(7.3rc2)报告断言检查不是必需的(因为Nonnull注释).我不完全确定这是一个Netbeans错误.
可以删除断言行,因为我指定了@Nonnull注释吗?
据我所知,注释仅在静态分析期间使用,而assert在启用时在执行期间处于活动状态,因此两个不是替代.
我正在使用带有C API的SQLite.在C API上,我可以检查具有sqlite3_column_*
函数的列的结果值.问题是对于值的情况没有功能NULL
.当然,我可以通过sqlite3_column_bytes
函数检查值,但它可能会导致转换,我想完全避免转换.
如何检查一行中的值是否为NULL?
我有很多@NonNull
使用Lombok构建器的字段.
@Builder
class SomeObject {
@NonNull String mandatoryField1;
@NonNull String mandatoryField2;
Integer optionalField;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这为调用者提供了在不设置a的情况下创建对象的选项mandatoryField
,在使用时会导致运行时失败.
SomeObject.builder()
.mandatoryField1("...")
// Not setting mandatoryField2
.build();
Run Code Online (Sandbox Code Playgroud)
我正在寻找在构建时捕获这些错误的方法.
有一些非Lombok方式,如StepBuilders,甚至是构造函数,以确保始终设置必填字段,但我对使用Lombok构建器实现此目的的方式感兴趣.
另外,我理解@AllArgsConstructor
为了进行编译时检查而设计类(比如一个步骤构建器或者一个)会产生很多笨拙的代码 - 这就是为什么我有动力构建一个后编译的FindBugs步骤来检测这些.
现在,当我明确地将@NonNull
字段设置为时,FindBugs确实失败了null
:
FindBugs检测到此失败,
new SomeObject().setMandatoryField1(null);
Run Code Online (Sandbox Code Playgroud)
但它没有检测到这个:
SomeObject.builder()
.mandatoryField1(null)
.build();
Run Code Online (Sandbox Code Playgroud)
它也没有发现这个:
SomeObject.builder()
.mandatoryField1("...")
//.mandatoryField2("...") Not setting it at all.
.build();
Run Code Online (Sandbox Code Playgroud)
这似乎正在发生,因为Delomboked构建器看起来像,
public static class SomeObjectBuilder {
private String mandatoryField1;
private String mandatoryField2;
private Integer optionalField;
SomeObjectBuilder() {}
public SomeObjectBuilder mandatoryField1(final String mandatoryField1) {
this.mandatoryField1 …
Run Code Online (Sandbox Code Playgroud) null-check ×10
null ×5
c# ×3
comparison ×2
findbugs ×2
java ×2
javascript ×2
assert ×1
builder ×1
c ×1
c++ ×1
dynamic ×1
generics ×1
lombok ×1
null-pointer ×1
sql ×1
sqlite ×1
undefined ×1
value-type ×1