参考和数据类型检查,这些是一样的吗?

时间:2012-04-29 15:57:08

标签: javascript

我的库中有一个简单的函数来检查对象引用的有效性(这里的对象意味着对已创建的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)进行测试时,我发现最终结果没有区别。该功能似乎按预期工作。

说这两个版本做同样的事情是否安全?

4 个答案:

答案 0 :(得分:1)

不,在我看来,这些功能不起作用:

第一个选项
如果aRef不是undefinednull且var的类型为object,则返回true。

第二个选项
首先,我们将aRef转换为布尔值。 nullundefined0等值变为false,其他所有值都变为true。如果是true(因此不是其中一个值),则检查类型是否为对象。

因此,如果aRef0,则第二个选项返回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

中的任何一个将此部分评估为 false
(aRef)

而另一个0, "", false, null, undefined, NaN

答案 2 :(得分:0)

他们不会这样做,尽管他们最终会得到相同的结果。

第一个函数更严格的是它一起被视为假,或者如果不是,它是一个对象。

第二个函数会检查aRef!false是否为[]或不是任何虚假值(即nullundefined,{{1}})并检查是否如果不是,则类型是一个对象。

我更喜欢第一个函数,因为它接受的更严格,但是如果它的全部相同,那么应该使用表现最好的函数。

至于争议,你必须要小心你如何/何时在方程中使用假值,但如果你做了你想做的事情(为此你需要知道什么是假值并且你正确地实现它应该没有问题。但这两者很难拼凑起来。因此,如果这样做了你想要它做的事情,或者更多或更少,无论如何都要使用它。

答案 3 :(得分:0)

有趣的情况,但尽管 完全不同 ,但两者的行为方式似乎合乎逻辑。让我们看看第一个问题。

return ( !(aRef == null || aRef == undefined) && typeof(aRef) == "object");

下面,

nullundefined都表示false状态与! infront相结合,使其等于将返回{{1}的aRef表达式如果两者都不是 null 或不是未定义