3

我的库中有一个简单的函数来检查对象引用的有效性(这里的对象意思是对创建的 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

4 回答 4

1

不,在我看来,这些功能的工作方式不同:

第一个选项
If aRefis not undefinedornull并且 var 的类型 isobject它返回 true。

第二个选项
首先我们转换aRef为布尔值。价值观喜欢nullundefined0成为false,其他一切都成为true。如果是true(所以不是这些值之一),它会检查类型是否为对象。

所以第二个选项 return false if aRefis 0,你不想要的东西。而且它不是检查它的优雅方法,因为您检查对象或字符串或其他东西是否等于布尔值。

至少他们不会返回同样的东西。(aRef)第一个选项返回一个布尔值,但如果第二个选项为 false ,则返回您在函数中输入的值:

varIsValidRef(0);
>>> 0

varIsValidRef('');
>>> ""

varIsValidRef(undefined);
>>> undefined

varIsValidref(null);
>>> null

因为 JavaScript 将这些值用作虚假值,所以如果您使用 if 语句或类似的东西,您看不到这些返回值之间的差异。

所以我建议你使用第一个选项。

于 2012-04-29T16:11:06.443 回答
1

它们有很大的不同:

!(aRef == null || aRef == undefined)

这部分被评估为与任何这些"null", null, "undefined", undefined

(aRef)

而这个其他与任何这些0, "", false, null, undefined, NaN

于 2012-04-29T16:28:07.083 回答
0

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

第一个函数更加严格,它将一起算作假,或者如果不是,如果它是一个对象。

第二个函数将检查是否aRef存在!false任何虚假值(即[], null, undefined)并检查类型是否为对象(如果不是)。

我更喜欢第一个函数,因为它接受的内容更严格,但如果它都相同,则应该使用执行最佳的函数。

至于争议,确实你必须小心如何/何时在方程式中使用虚假值,但如果它做了你想要它做的事情(为此你需要知道什么是虚假值)并且你正确实施应该没问题。但这两者很难放在一起。因此,如果这可以满足您的要求,并且或多或少,请务必使用它。

于 2012-04-29T16:10:09.777 回答
0

有趣的案例,但尽管完全不同,但两者的行为方式相同似乎是合乎逻辑的。让我们看看第一种说法。

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

这里,

null并且undefined两者都表示false与 infront 结合的状态!,使其等于在两者都不是null或 not undefinedaRef的情况下将返回的表达式。true

于 2012-04-29T16:11:44.380 回答