java未定义变量_如何在JavaScript中检查未定义或null变量?

我们经常在JavaScript代码中使用以下代码模式

if (typeof(some_variable) != 'undefined' && some_variable != null)

{

// Do something with some_variable

}

有没有更冗长的检查方法具有相同的效果?

根据一些论坛和文献的说法,简单地讲,以下应该具有相同的效果。

if (some_variable)

{

// Do something with some_variable

}

不幸的是,当未定义some_variable时, Firebug some_variable这样的语句评估为运行时错误,而第一个语句就可以了。 这仅仅是Firebug的一种(有害的)行为,还是这两种方式之间确实存在一些区别?

#1楼

我认为测试“值是否为null或undefined ”的最有效方法是

if ( some_variable == null ){

// some_variable is either null or undefined

}

因此,这两行是等效的:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}

if ( some_variable != null ) {}

注1

正如问题中提到的那样,简短变体要求声明了some_variable ,否则将引发ReferenceError。 但是,在许多用例中,您可以假定这是安全的:

检查可选参数:

function(foo){

if( foo == null ) {...}

检查现有对象的属性

if(my_obj.foo == null) {...}

另一方面, typeof可以处理未声明的全局变量(仅返回undefined )。 正如Alsciende解释的那样,出于充分的原因,这些案例应该减少到最少。

笔记2

这个-甚至更短-的变体并不等效:

if ( !some_variable ) {

// some_variable is either null, undefined, 0, NaN, false, or an empty string

}

所以

if ( some_variable ) {

// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""

}

注3

通常,建议使用===代替== 。 提议的解决方案是该规则的例外。 为此, eqnull 语法检查器甚至提供了eqnull选项。

应该使用严格的相等性检查(===)来支持==。 唯一的例外是通过null检查undefined和null时。

// Check for both undefined and null values, for some important reason. undefOrNull == null;

#2楼

由于没有一个完整而正确的答案,因此我将尝试总结一下:

通常,表达式为:

if (typeof(variable) != "undefined" && variable != null)

无法简化,因为可能未声明该variable因此省略typeof(variable) != "undefined"将导致ReferenceError。 但是, 您可以根据上下文简化表达式 :

如果variable是global ,则可以简化为:

if (window.variable != null)

如果它是local ,则可以避免未声明此变量的情况,并且还可以简化为:

if (variable != null)

如果它是object property ,则不必担心ReferenceError:

if (obj.property != null)

#3楼

您必须定义这种形式的功能:

validate = function(some_variable){

return(typeof(some_variable) != 'undefined' && some_variable != null)

}

#4楼

首先,您必须非常清楚要测试的内容。 JavaScript具有各种隐式转换,可带您进入旅途,还有两种不同类型的相等比较器: ==和=== 。

测试null或undefined的函数test(val)应该具有以下特征:

test(null) => true

test(undefined) => true

test(0) => false

test(1) => false

test(true) => false

test(false) => false

test('s') => false

test([]) => false

让我们看看这里的哪些想法实际上通过了我们的测试。

这些工作:

val == null

val === null || val === undefined

typeof(val) == 'undefined' || val == null

typeof(val) === 'undefined' || val === null

这些不起作用:

typeof(val) === 'undefined'

!!val

我创建了一个jsperf条目来比较这些方法的正确性和性能 。 暂时的结果尚无定论,因为在不同的浏览器/平台上运行次数不足。 请花一点时间在计算机上运行测试!

目前,似乎简单的val == null测试可提供最佳性能。 它也是最短的。 如果需要补码,可以将测试否定为val != null 。

#5楼

如答案之一所述,如果您谈论的是具有全局作用域的变量,那么可能会很幸运。 如您所知,您全局定义的变量往往会添加到Windows对象中。 您可以利用这一事实,因此可以说您正在访问一个名为bleh的变量,只需使用double倒数运算符(!!)

!!window['bleh'];

当尚未声明bleh并为其分配值时,这将返回false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值