一种语言将 undefined 评估为等于 false 是不是常见?如果是这样,为啥要这样做?

Posted

技术标签:

【中文标题】一种语言将 undefined 评估为等于 false 是不是常见?如果是这样,为啥要这样做?【英文标题】:Is it common for a language to evalute undefined as equal to false? If so, why is this done?一种语言将 undefined 评估为等于 false 是否常见?如果是这样,为什么要这样做? 【发布时间】:2010-10-13 00:37:54 【问题描述】:

更新:问题仍未得到解答。 @Alastair_Pitts: 除非我遗漏了什么,否则这是一个由两部分组成的问题。第二部分,“如果是这样,为什么要这样做?”并没有得到答复。


相信问题很明确,但如果您有任何问题,请告诉我。谢谢!

undefined = unknown,是对基于三元逻辑的系统的引用。


参考: http://en.wikipedia.org/wiki/Ternary_logic

【问题讨论】:

编辑: 有趣的是,我提出的一个问题在与此问题相同的时间内获得 10 次浏览,并获得 3 票赞成 -- 但是这个问题有 131+ 次观看 得到 零票 -- 请解释原因,我不明白吗? ... 其他问题: ***.com/questions/3920193/… 3/10 的人认为另一个问题是个好问题。 @Blunders:我回滚到您问题的先前版本,因为它不是讨论无关问题的地方。如果您对此有任何疑问,meta 是一个讨论它的地方。 用户按标签浏览。这个问题你用了很多热门标签,所以浏览量很大。 我相信你的问题是弱类型的一个例子。 【参考方案1】:

在许多(如果不是大多数)语言中,值要么是虚假的,意味着某物不存在或缺乏价值,要么是真实的,意味着某物存在或有价值。虚假值的列表通常是:(这些评估为 false)

    0(零,数字) ''(空字符串) null(如果存在此值) 未定义(如果存在此值) false/False(如果是布尔类型)

其他任何东西都是真实的并且评估为真实。

编辑:让答案不再偏向于 javascript

【讨论】:

这看起来真的是 javascript-y 那是因为它是(专业地,我写了很多 JavaScript,所以通常首先想到它的规则)Python 的规则是相似的,虽然 @indieinvader: +1 是的,您的编辑确实使它更清晰,更少 JS 偏见。谢谢! @indie、C#、C/C++、Java、Ruby、Lua、lisp 和许多许多语言不会将这些值评估为 false。当你说“大多数”甚至“很多”时,你是完全错误的。 根据语言的不同,空字符串可以以多种方式摆动。从一般意义上说,其他人似乎是公平的。【参考方案2】:

我认为答案是否定的,大多数语言不认为“未定义”与错误相同。当然,了解一种语言的细节以了解它如何处理truefalseNULL(或nil)等是很重要的。

你用 Ruby 标记了这个,所以这里有一些 Ruby 示例:

>> x # raises NameError: undefined local variable

>> x = nil # initializes x and assigns the value nil

>> x == true # false

>> x == false # false (in Ruby nil is not false, but see below)

>> x.nil? # true

>> x ? true : false # false -- Ruby treats nil values as false in conditions

>> x = 1 # now x has a value

>> x.nil? # false

>> x ? true : false # true

至于“为什么将 undefined 评估为 false”,当您需要在使用之前知道变量已定义时,它会很方便。例如,在 Ruby 中,您经常会看到:

if x && x == "some interesting value"
  do_important_thing
end

如果 x 未定义,则条件的第一部分返回 false 并且语句短路。这比:

if x.nil?
  if x == "some interesting value"
    do_important_thing
  end
end

【讨论】:

你的意思是x && x.y == "some interesting value"【参考方案3】:

我只在 Javascript 中遇到过这种情况,发生这种情况时,该值实际上是一个定义为“未定义”的字符串

如果您要对此进行测试:

if (someVar==true) 
document.write('True');
 else if (someVar==false) 
document.write('False');
 else 
document.write('Other');

它将输出 'Other' 而不是 true 或 false - 不知道这是否有帮助...

【讨论】:

您的第一条评论不正确(未定义不是字符串,但如果将其转换为字符串,您将得到字符串"undefined")但您的第二点对于未定义 是正确的和 字符串。这:var x, y = "s"; alert(x == true || x == false); alert(y == true || y == false); alert(typeof x); alert(typeof y); 输出 false、false、未定义、字符串。【参考方案4】:

取决于“等于假”的含义。 php 特别有两个不同的运算符。你可以说value == false 表示该值是一个计算结果为假的标量,而value === false 表示它是未定义的。

同样,SQL 有NULL,这是一个与 0(或 FALSE)无关的特殊值。

C/C++ 并没有真正的“未定义”概念,只有“未初始化”,在这种情况下变量存在,但它的值没有定义,如果你想让你的代码不糟糕,不应该读取。

在标量意义上(即,如果你有一个值),false 通常被定义为“0”,而 true 被定义为“非零”,但这不是一个全面的标准。

【讨论】:

在 C++ 中,读取未初始化的变量会导致未定义的行为。 (这使得代码最糟糕。) 正是我所说的。如果您不想让代码变得糟糕,请不要读取未初始化的值。 Sucky 代码不等同于具有未定义的行为,前者是后者的暗示。 :P(拥有 UB 比说它糟透了。) 取决于你的吸吮阈值 :) 但你是对的,应该明确说明以确保没有误解:读取未初始化的值是未定义的行为,可能导致跨平台的意外行为或配置,包括崩溃,不正确的结果,你可以命名它。它实际上是最糟糕的错误之一——在调试版本中运行良好和酷的代码并在发布版本中惨遭失败是很常见的。祝你调试愉快。【参考方案5】:

不一定!

这取决于您所说的“未定义”是什么意思。如果您的意思是“未初始化”,那么答案是否定的。

在 C 或 C++ 中,假设有一个语句

int x;

在函数范围内。语句执行后,x是合法的整型变量,但没有初始化。 x 可以取任何值。如果取值0,则为false;对于所有其他值(概率更高),它是true。但是,最后,x 实际获得的值并不重要。从程序正确性的角度来看,它是“未定义的行为。”

虽然语言没有提供,但也可以实现三态,例如真、假、未知。例如,参见Boost tribool 中的tribool

【讨论】:

在 C++ 中,读取未初始化的变量会导致未定义的行为。所以没有必要去思考你读了它会得到什么价值。 为了让 GMan 的评论更进一步,虽然x 可以等于0 或可以等于其他任何值,但谈论概率是没有意义的。允许将所有未初始化的值实际初始化为固定数字(通常由调试器完成),或者可以根据先前的操作以高度确定性的方式进行设置。但是我们只能通过看C++本身以外的事情来有意义地谈论这个,就C++而言,它在这件事上没有什么可说的。兼容的编译器可能会将0 的概率保持在 100%、0% 或任何值。 @GMan 和@Jon Hanna:感谢您的 cmets。我提到x 没有初始化。你们俩都是对的,未初始化的变量可能会导致未定义的行为。我还提到,“如果您的意思是“未初始化”,那么答案是否定的。我根据您的 cmets 进行了一些编辑。如果您有更多建议,关于如何添加或编辑以改进答案,我很想听听您的 cmets。

以上是关于一种语言将 undefined 评估为等于 false 是不是常见?如果是这样,为啥要这样做?的主要内容,如果未能解决你的问题,请参考以下文章

js中!!的原理

Expo SDK32 undefined 不是对象(评估 '_expo2.default.KeepAwake')

js null undefined 真的等于false吗

TypeError: 'undefined' 不是函数(评估 '$scope.$dismiss()')

undefined 不是对象(评估 'RCTToastAndroid.SHORT')

undefined 不是对象(评估 '_react.PropTypes.object')