引用和数据类型检查,这些是相同的

Reference and datatype checking, are these the same?

本文关键字:数据类型 检查 引用      更新时间:2023-09-26

我的库中有一个简单的函数,用于检查对象引用的有效性(这里的对象是指对创建的HTML元素的引用,主要是DIV的(。它看起来像这样:

function varIsValidRef(aRef) {
    return ( !(aRef == null || aRef == undefined) && typeof(aRef) == "object");
}

在实验过程中,我发现这具有相同的效果:

function varIsValidRef(aRef) {
    return (aRef) && typeof(aRef) == "object";
}

我知道关于速记((测试存在一些争议?在针对各种数据类型(null、未定义、整数、浮点数、字符串、数组(进行测试时,我发现最终结果没有差异。该功能似乎按预期工作。

可以

肯定地说这两个版本做完全相同的事情吗?

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

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

第二种选择
首先,我们将aRef转换为布尔值。像nullundefined0这样的值变得false,其他一切都变得true。如果它是true(因此不是这些值之一(,它会检查类型是否为 object。

因此,如果aRef0,则第二个选项返回 false,这是您不想要的。而且这不是一种优雅的检查方式,因为您可以检查对象或字符串或其他东西是否等于布尔值。

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

varIsValidRef(0);
>>> 0
varIsValidRef('');
>>> ""
varIsValidRef(undefined);
>>> undefined
varIsValidref(null);
>>> null

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

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

它们

有很大的不同:

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

使用以下任何一种"null", null, "undefined", undefined,此部分的评估结果为 false

(aRef)

而这个与这些0, "", false, null, undefined, NaN中的任何一个

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

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

这里

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

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

第一个函数在将什么算作 false 方面更加严格,或者如果不是,如果它是一个对象。

第二个函数将检查aRef是否!false任何 falsy 值(即 []nullundefined(,如果不是,则检查类型是否是对象。

我更喜欢第一个函数,因为它接受的内容更严格,但如果它都一样,则应使用性能最佳的函数。

至于争议,确实你必须小心如何在方程中使用 falsy 值,但如果它做了你想要它做的事情(为此你需要知道什么是 falsy 值(并且你正确地实现了它应该没有问题。不过,这两者很难放在一起。因此,如果它做了您想要它做的事情,并且仅此而已,请务必使用它。