在JavaScript中的非原始类型上使用比较“if(foo)”而不是“if(foo == null)”是否安全?

时间:2014-09-18 12:09:33

标签: javascript

假设foo被声明为非基本类型变量,但可能未初始化,是否有可能在非基本对象比较中使用,如下所示:

if (foo) {
...
}

或者这样做的时间越长越好?

// not using "===" here on purpose, because the variable is non-primitive, so the value can't be 0 or empty string
if (foo != null) {
...
}

如果不相等,那么为什么。

2 个答案:

答案 0 :(得分:2)

"非原始类型"你的意思是对象?是的,所有对象都是真实的,所以它足以通过if (foo)区分foo变量可能包含的任何虚假值,例如原始值undefined和{{1} }。

但是,请注意,您不能将变量声明为非基本类型"在JavaScript中,所以你必须通过其他方式确保它永远不会有一个真实的原始值。如果你可以确保它总是包含一个对象,你根本不需要这个条件。

答案 1 :(得分:0)

根据我的经验,我发现在布尔表达式中准确指定您想要的内容并且绝不依赖于类型强制是最安全的。

如果您不希望它等于0或null或空字符串,则:

if (foo !== 0 && foo !== '' && foo !== null) {
  /* note that if foo = undefined, this will still get executed. */
}

Underscore这样的库或像Angular这样的框架都有类似的功能,所以你可以这样做:

if (_.isObject(foo) === true) {
  /* execute this */
}