我的库中有一个简单的函数来检查对象引用的有效性(这里的对象意味着对已创建的HTML元素的引用,主要是DIV的)。它看起来像这样:
function varIsValidRef(aRef) {
return ( !(aRef == null || aRef == undefined) && typeof(aRef) == "object");
}
在进行实验时我发现这具有相同的效果:
function varIsValidRef(aRef) {
return (aRef) && typeof(aRef) == "object";
}
我理解短手()测试有一些争议吗?在针对各种数据类型(null,undefined,integer,float,string,array)进行测试时,我发现最终结果没有区别。该功能似乎按预期工作。
说这两个版本做同样的事情是否安全?
答案 0 :(得分:1)
不,在我看来,这些功能不起作用:
第一个选项
如果aRef
不是undefined
或null
且var的类型为object
,则返回true。
第二个选项
首先,我们将aRef
转换为布尔值。 null
,undefined
和0
等值变为false
,其他所有值都变为true
。如果是true
(因此不是其中一个值),则检查类型是否为对象。
因此,如果aRef
为0
,则第二个选项返回false,这是您不想要的。并且它不是一种优雅的方法来检查它,因为你检查对象或字符串或某些东西是否等于布尔值。
至少他们不会回报同样的事情。第一个选项返回一个布尔值,但如果(aRef)
为false,则第二个选项返回您放入函数中的值:
varIsValidRef(0);
>>> 0
varIsValidRef('');
>>> ""
varIsValidRef(undefined);
>>> undefined
varIsValidref(null);
>>> null
因为JavaScript使用这些值作为虚假值,所以如果使用if语句或类似的东西,则不会看到这些返回值之间的差异。
所以我建议你使用第一个选项。
答案 1 :(得分:1)
他们有很大的不同:
!(aRef == null || aRef == undefined)
使用这些"null", null, "undefined", undefined
(aRef)
而另一个0, "", false, null, undefined, NaN
答案 2 :(得分:0)
他们不会这样做,尽管他们最终会得到相同的结果。
第一个函数更严格的是它一起被视为假,或者如果不是,它是一个对象。
第二个函数会检查aRef
是!false
是否为[]
或不是任何虚假值(即null
,undefined
,{{1}})并检查是否如果不是,则类型是一个对象。
我更喜欢第一个函数,因为它接受的更严格,但是如果它的全部相同,那么应该使用表现最好的函数。
至于争议,你必须要小心你如何/何时在方程中使用假值,但如果你做了你想做的事情(为此你需要知道什么是假值并且你正确地实现它应该没有问题。但这两者很难拼凑起来。因此,如果这样做了你想要它做的事情,或者更多或更少,无论如何都要使用它。
答案 3 :(得分:0)
有趣的情况,但尽管 完全不同 ,但两者的行为方式似乎合乎逻辑。让我们看看第一个问题。
return ( !(aRef == null || aRef == undefined) && typeof(aRef) == "object");
下面,
null
和undefined
都表示false
状态与!
infront相结合,使其等于将返回{{1}的aRef
表达式如果两者都不是 null 或不是未定义。