使用“变量 !== FALSE”的缺点


Disadvantages of using "variable !== FALSE"

阅读招聘广告,一个要求(叹息)是申请人应该或多或少地讨厌variable !== FALSE的使用。但是,我看不出其中的原因,因为我觉得它很方便。

假设一个函数(get_user( int user_id ))如果不成功(找到请求的用户)返回FALSE,我可以简单地使用:

user = get_user(823);
if(user !== FALSE) {
   // User found   
} else {
  // No user found
}

当然,我可以简单地使用if(!user),但是,我并不总是觉得它适合,尤其是当我有几个条件要满足时。

编写这样的代码有什么不容易

的吗?

澄清:这是一个更全球性的问题,因为广告反对PHP使用!== FALSE和C#使用!= FALSE

你说get_user不成功时返回 false - 这就是大部分问题。如果函数调用不成功,它应该抛出异常,而不是返回非类型安全的答案("false"而不是 User)。

你可以意外地做

if($variable = FALSE)

这将改变$variable的价值

在 Javascript 中,以下两个是等效的:

user != FALSE
!user

但是,这略有不同:

user !== FALSE

因为它是 === 的否定,它检查值和类型是否相同。

参考:

  • http://www.w3schools.com/js/js_comparisons.asp

如果你在Java中有

Boolean flag1 = new Boolean(true);
Boolean flag2 = new Boolean(false);
if (flag1 == Boolean.TRUE || flag1 == Boolean.FALSE) // is false.
if (flag2 == Boolean.TRUE || flag2 == Boolean.FALSE) // is false.
if (flag1 != Boolean.FALSE && flag2 != Boolean.FALSE) // is true

使用 == FALSE 或 != FALSE 可能无法按照您的想法工作,因此虽然它更冗长,但也容易出错。

从开发的角度来看,最好设计不返回计算结果为 FALSE 的不同值的方法。例如,您的函数不应返回多个可能的0 or NULL or FALSE or "" (empty string) or empty array()值,因为这需要一些不明显的逻辑来检查结果。

另一方面,如果我们谈论PHP,最好知道某些函数同时返回零或false,例如strpos。您不应该假设if (!strpos(...))意味着字符串不包含在另一个字符串中,它可能处于零位置,计算结果为 FALSE 。有时,函数也可能在失败时返回 FALSE,或在成功时返回空数组(没有产生计算结果为 TRUE 的结果)。

因此,指出在某些情况下这是必要的或有用的,但一般来说,返回多个计算结果为 FALSE 的值是不正确的做法,因此需要在比较运算符中包含类型。

要求的内容

可能与口味和使用领域有关。

在严格的逻辑系统中,人们可能倾向于选择表示对象(在任何类型的存储或内存中)的 ID 值,使其不为 0(并且仅为正数)。

这为用 0 来表示不存在的对象(所谓的 NULL 对象)留下了空间。

负数也可以用来发出元信息的信号,如错误。但是一个严格的系统不应该使用任何负数,并在某些上下文而不是数据流的主线上传递元信息。

可能这就是想要的。在这种情况下,值FALSE将不存在,因为整个系统仅与数字有关。

这种系统的好处是它几乎适用于每种编程语言和不同的范式。

通常,数字零表示虚假条件,而非零数字表示真实条件。

实际上这取决于语言。

C

在程序语言 C 中没有布尔值,然后 TRUE 或 FALSE 是定义的值,大多数 1 表示 TRUE,0 表示 FALSE。但是,由于这只是一种约定,因此有些人将 FALSE 定义为 -1,将 TRUE 定义为 255。你会看到这会导致奇怪的行为,因此在 C 中始终检查定义的值并确保这些值匹配。

同样在 C 语言中,有些人认为最好的方法是使用 'FALSE == a' 而不是 'a == FALSE'。原因是,如果忘记了一个 =,第一个 (FALSE == a) 会给出编译错误,第二个被视为赋值,这显然是无意的。

C#

但是,在 C# 中,true 和 false 是预定义的,根据 true 和 false 检查变量是毫无用处的。 a == true 的意思与只写 a 完全相同。

a == true 表示变量 a 应该是布尔值,如果你只写 'a',那么这意味着它也可以是 0、[]、{} 或任何启动的值。

有点题外话:我认为如果这些细节是"工作要求"的一部分,那么工作要求就像 10,000 页。